{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Welcome to the Kotlin Notebook!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start with something simple: execute a cell with a simple arithmetics and immediately see the result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:24:56.416908100Z",
     "start_time": "2023-07-01T16:24:55.936894100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "4"
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "2 + 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Execution results could be saved in variables and reused"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:24:56.780894800Z",
     "start_time": "2023-07-01T16:24:56.405912Z"
    }
   },
   "outputs": [],
   "source": [
    "val result = 3 * 14"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:24:57.002898200Z",
     "start_time": "2023-07-01T16:24:56.669899300Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "42"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:24:57.307907Z",
     "start_time": "2023-07-01T16:24:56.854896600Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "21"
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(Out[3] as Int) / 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Variables defined in the notebook can lose their nullability if they are not actually nulls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:24:57.817903600Z",
     "start_time": "2023-07-01T16:24:57.161909200Z"
    }
   },
   "outputs": [],
   "source": [
    "val a1: Int = 1\n",
    "val a2: Int? = 2\n",
    "val a3: Int? = null"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:24:58.061904900Z",
     "start_time": "2023-07-01T16:24:57.670896100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "3"
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a1 + a2 // OK, a2 was converted to Int"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:24:58.473901300Z",
     "start_time": "2023-07-01T16:24:57.896894200Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Line_9.jupyter.kts (1:6 - 8) Type mismatch: inferred type is Int? but Int was expected"
     ]
    }
   ],
   "source": [
    "a1 + a3 // compile-time error"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Rich outputs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Outputs might be not only plain text. They could also be images and HTML. HTML can contain CSS and JavaScript."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:24:58.725894100Z",
     "start_time": "2023-07-01T16:24:58.395028700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": "\n    <p>Counter: <span id=\"ctr\">0</span> <button onclick=\"inc()\">Increment</button></p>\n    <script>\n      function inc() {\n        let counter = document.getElementById(\"ctr\")\n        counter.innerHTML = parseInt(counter.innerHTML) + 1;\n      }\n    </script>\n"
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HTML(\"\"\"\n",
    "    <p>Counter: <span id=\"ctr\">0</span> <button onclick=\"inc()\">Increment</button></p>\n",
    "    <script>\n",
    "      function inc() {\n",
    "        let counter = document.getElementById(\"ctr\")\n",
    "        counter.innerHTML = parseInt(counter.innerHTML) + 1;\n",
    "      }\n",
    "    </script>\n",
    "\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**NB!** If your outputs contain JS, notebook should be marked as trusted.\n",
    "\n",
    "![trusted-notebook](screenshots/screenshot3.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Images could be loaded by link. In this case, it won't show if the link breaks or if you lose Internet connection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "%use lib-ext(0.11.0-398)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": "<img src=\"https://kotlinlang.org/docs/images/kotlin-logo.png\" width=\"300\"/>"
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image(\"https://kotlinlang.org/docs/images/kotlin-logo.png\", embed = false).withWidth(300)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can also embed images. In this case they will stay in the notebook forever"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": "<img src=\"\" width=\"400\"/>"
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val kotlinMascot = Image(\"https://blog.jetbrains.com/wp-content/uploads/2023/04/DSGN-16174-Blog-post-banner-and-promo-materials-for-post-about-Kotlin-mascot_3.png\", embed = true).withWidth(400)\n",
    "kotlinMascot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The cell can also have several outputs, to achieve it use `DISPLAY()` function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": "<h2>Kodee is back!</h2>"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {}
    },
    {
     "data": {
      "text/html": "<img src=\"\" width=\"400\"/>"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {}
    }
   ],
   "source": [
    "DISPLAY(HTML(\"<h2>Kodee is back!</h2>\"))\n",
    "DISPLAY(kotlinMascot)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With Kotlin Notebook, you can also render LaTeX formulae"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:36.593896700Z",
     "start_time": "2023-07-01T16:25:31.532914200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": "<img src=\"\"/>"
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "LATEX(\"c^2 = a^2 + b^2 - 2 a b \\\\cos\\\\alpha\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can also output BufferedImage's. They are embedded into notebook"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:36.659903900Z",
     "start_time": "2023-07-01T16:25:33.940897200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAEcUlEQVR4Xu3SMY4cMQADwf3/p+1cHWvAE4pAJR3z9/v9/gH8EQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqoRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCcBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAEz6D5tIz0MBx/WUAAAAAElFTkSuQmCC",
      "text/plain": "class java.awt.image.BufferedImage: 300x300 px"
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import java.awt.Color\n",
    "import java.awt.image.BufferedImage\n",
    "\n",
    "val width = 300\n",
    "val height = width\n",
    "\n",
    "val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)\n",
    "\n",
    "val graphics = image.createGraphics()\n",
    "graphics.background = Color.BLACK\n",
    "graphics.clearRect(0, 0, width, height)\n",
    "graphics.setRenderingHint(\n",
    "    java.awt.RenderingHints.KEY_ANTIALIASING,\n",
    "    java.awt.RenderingHints.VALUE_ANTIALIAS_ON\n",
    ")\n",
    "graphics.color = Color.WHITE\n",
    "graphics.fillRect(width / 10, height * 8 / 10, width * 10 / 20, height / 10)\n",
    "graphics.dispose()\n",
    "\n",
    "image"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Generally, you can display any output using `mimeResult` function.\n",
    "We're using [Jupyter approach](https://docs.jupyter.org/en/latest/reference/mimetype.html) for outputs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:36.742900200Z",
     "start_time": "2023-07-01T16:25:34.835907800Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "JetBrains logo",
      "text/html": "<b>JetBrains</b> logo"
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mimeResult(\n",
    "    MimeTypes.PLAIN_TEXT to \"JetBrains logo\",\n",
    "    MimeTypes.HTML to \"<b>JetBrains</b> logo\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using libraries and dependencies"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can always turn on source and binary dependencies of a current project.\n",
    "To do it, use the corresponding button in the toolbar."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:37.349895400Z",
     "start_time": "2023-07-01T16:25:35.144897600Z"
    }
   },
   "outputs": [],
   "source": [
    "import java.io.File\n",
    "import javax.imageio.ImageIO\n",
    "\n",
    "fun showScreenshot(id: Any) {\n",
    "    DISPLAY(ImageIO.read(File(\"screenshots/screenshot$id.png\")))\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:37.373896800Z",
     "start_time": "2023-07-01T16:25:35.378898800Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKgAAADuCAYAAAAdkz9HAABQQElEQVR4Xu29ebAtx33fd/9V/rRKZUdVrsS2bCuqrJZN5yaOspVdiZWkXKxUpRzZJVZUdWMmEQEQxCKK2iCSjyTEAxFyoYoAKVAkCIMCRZEgdflEAeAC4PGBxPrwhOUSeADx8EDsmwBiIYHO7ZnpOT2//vVM9yznnDv386n6FN+Z6enp6Z4znP5iztytl156ySAiIiIiIiIiIq7LLbkAERERERERERFxlRJQISIiIiIiIiLiWiWgQkRERERERETEtUpAhYiIiIiIiIiIa5WAChERERERERER1+rWAw88YBAREREREREREdfl1r333mvavPvuuxERERERERERESeTgAoREREREREREdfq1ssvv2zatIUAAODgIH/LjYiIiIiIuOkSUAEAzAx5oUdERERERNx0CagAAGaGvNAjIiIiIiJuugRUAAAzQ17oERERERERN10CKgCAmSEv9IiIiIiIiJsuARUAwMyQF3pERERERMRNl4AKAGBmyAs9IiIiIiLipktABQAwM+SFHhERERERcdOdLKD6xl9/zNz0U6fNsb/2fXP8Jx8yt/7Uvea7f+Muc9tP32pu/5s3mTv/w+vNXX9719z9d//U3PP3P2dO/txnzF/+x58w9/1nl5n7/8ElZu8ffth87x9fZB7cfp859U/OMw//t2eZR/77f2Me/ae/IncFAAAe8kKPiIiIiIi46U4WUN3w02cmCameXVwtdwUAAB7yQo+IiIiIiLjpThZQfe1vPj56SHX6X37EvPXq63JXAADgIS/0iIiIiIiIm+5kAdVX/4MnRg2pHvyv329e+8vTcjcAACCQF3pERERERMRNd7KA6it/+8lRQ6pnr7hF7gIAABTkhR4REREREXHTnSyg+tLffao1pHr80ufNize/Yu7953udIdUj//pPjHnzLbmLjeDo1VvmJy5ZmO/JFbBWDuu4fO/6bfMT5++Yo3LFCinaMKO+34Q+zUVe6BERERERETfdyQKqL/z9p6Mh1T3/+9N1uVcffN3c/rdOREOqe//hvzOvf//FuvyPn3ul/neMIpyITSifXJhfOH/L/ML1e3LNPrvmnfvrfuLqXbkiymENQnpxckcdF9uH/94FsTHpR3Nc9szHLhlxnPaPw7Y3Xl95Ho15PKlsQpiS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iIiIiIi46U4WUH3u3W8Ys3x4ypy45o3Gi9NjIZX9uZ/96343/PQZ842//pgaUuVgJ5fFT43UCWYZkER/ilRNroMnidqCjmqbZn27y7/iV4UPcmJc1CNCj7QgqmV5Qvt1Ik/MZLRdRQt2tDq1ZSa2H72tcly6Pjtiyxtox+Go2h6EMiMcU8p4Ls93JfST+8lpU0bZRkBVfQ76IzgWF+7Fxyjr2ArKOottlDGV9ceW5++3m1dfe60IqbqwZWzZXOSFHhERERERcdOdLKB69vQynXrpibfMFf+sfCfVGCFVFpGJtcNOMsNJv0c1kfb1y8rJbMky+NK28SfOzrAOJXDqs7yj/VG87ZphW1rbVSLBTh0ANOrJ2I/SVjkuXZ8dseUNIsfhcOdUEDANPCa53OmPZ30OeEFZUUe0vRltSiwrAyq3rFG+Z0CVd2yRcKxC1h9b3me/60Ze6BERERERETfdyQIqny9e+EbxTir34vShIRUAHD7UALaDPtvMAXmhR0RERERE3HQnD6ju+8ab5qP/9PXinVRjhVQAcPjID5v6vyPqoCMv9IiIiIiIiJvupAHVq39lzKW/9GPzkf/pjVFDKgA4fOQGVLnl54S80CMiIiIiIm66kwZU1/3bt8z7/9c3zZFfHDekAoDDR2rgVL/vKqHsXJEXekRERERExE130oAKAABWj7zQIyIiIiIibroEVAAAM0Ne6BERERERETddAioAgJkhL/SIiIiIiIibLgEVAMDMkBd6RERERETETZeACgBgZsgLPSIiIiIi4qabFFB94t8dRUTEA6K80CMiIiIiIm66BFSIiDNTXugRERERERE3XQIqRMSZKS/0iIiIiIiIm+7Wvffea9okoEJEPFja6zYiIiIiIuJBcuvUqVOmTVtITn4QEXFzlRd6RERERETETTcpoJKPXSEiIiIiIiIiIo7l1unTp43m8ePHCagQEREREREREXFyCagQEREREREREXGtElAhIiIiIiIiIuJaJaBCRETE3j711FPmnnvuMbfeequ5+eabsae33HKLueOOO8xDDz1kXnzxxaCfEREREefu7AMq9zZ4uRwPh4z/tM6lf+dyHIir9syZM+bYsWNFwHLixInivuHRRx/FHt5///11yHfXXXdlh1RcxxAREfGgS0CFs5bxn9a59O9cjgNxlb7wwgtFoGKf/HnmmWcMDOeN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",
      "text/plain": "class java.awt.image.BufferedImage: 1192x238 px"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {}
    }
   ],
   "source": [
    "showScreenshot(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It is also possible to set these options for the newly created notebooks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:37.400895700Z",
     "start_time": "2023-07-01T16:25:35.697899500Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABcQAAAQsCAYAAAC/qZ/VAACAAElEQVR4XuzdCbglVX3v/eNAT8zghEOieW+8ebwxyTXNSd7ETHIzaYyPTxySixJOkpube9/Y0ZtEk9doty+Goz5JTGwHogKijTZyJAy2DAo4NAJKe2RQQBFooBEOYPdBRqF7vb1q76q96l//f9WqvXft2nufbz3P56Fr1aq1Vq2qfYr96+o6M8vLy87bs2dPYvfu3e4HP/iBu++++xJ33nmnu+GGG9zXvvY19+Uvf9ldeuml7vOf//zYO+OMMxILCwvRTj755GSf0047zZ133nlY4c4999yhO+ecc4DGnH322QAAAAAC8v+ZgXEnc4RhkHkHVqbPfvazU+2CCy5wF110kfvSl77kvvGNb7jvfve7bufOnYnbbrstcccddyRmwjDcB+FpGH7XXXe5b37zm+7iiy92X/jCFxIydK7DD2iUtm7dmjjzzDOjffSjH0328YH4pPjYxz7WiFNPPRVoxCmnnAIAAAAAQIH8/ggMi8y9ViKZKY6zj3/84337xCc+kTnrrLOSh7v9Q95f+cpXEtu3b3cz/olw+VT4zTffnFT2IbgPxK+66qqk7J577knq3n///QAAAAAAAAAAtM5n2/4B729961tJpr1ly5YkFD/99NPd+eefnwvFk0A8DMOvv/767Klw/5qUW265pdABAAAAAAAAAADj6NZbb3Vf//rXswe+febts2+fg8/IJ8N9Be+6665LXqMiGwMAAAAAAAAAYJz5bNtn3Gko7rNvn4HPpGH497///ew1Kf7RctkAAAAAAAAAAACTJH2Nis++fQaeBOL33ntv8gs0/S+/vPLKK5N3hcsdAQAAAAAAAACYJD779q9P8dn34uKim/Hh965du5KU/JJLLuGd4QAAAAAAAACAqbFz5073xS9+McnAk0Dcv1TcJ+RXXXVVoTIAAAAAAAAAAJPMPx3uM/CZpaWl5DUpfuWmm24qVAQAAAAAAAAAYJJ973vf6wXiX/rSl5KVu+++u1ARAAAAAAAAAIBJdtddd3UCcR+CX3zxxe6iiy5y/hdsyoqD2vudP3Huu+vd3p3r3WO3zblHdm50D9/27+6hXee5B+7e4X64Z6mwz7tuecDdt1xsCwAAAAAAAACAunz27TPwGZ+M+z94stKgfrj7TueuOW6/P3b7Fv/Qudv/p9v3wte6fT/V9fzXucde+r/d/T/Yne1z/DUPuwO2P+x+5foH3E17flhoEwAAAAAAAACAunKB+IUXXlioMKhHdp2XhOHu63/t9p1/hnv8I593e1/w150w/D8f6/b95Jzb9xP/2/3o789I6p9x0wPuSZfsc6u+8LBbfcUP3XNveNh9cc+DhXYBAAAAAAAAAKjDZ+Az3//+95M/NBGI773h75y75ni375IPuL1n7HB7/2jRPX70TvfYT5/k9j1/zu37v/7Cuef+H+ee8za39OGvuwM/+bh78ta9btVnHnarv3y/W33VA+6wmx51Jy0/XGgbAAAAAAAAAIBYjQbiD9z3nc6rUi77/9y1//Red8Zx/+C2/tTfuU88/+/cKT/xZvfRH/tzd/Izf8t95Gm/6U468qXug4e/wv3WL2xwR/7+RnfEq97uDnv9P7hD/sdb3bqTL3Brb3vM/a/lH7n7lH4AAAAAAAAAAO254oorCmVV+tlnUI0G4o/uPN25q/7K7bvgdLf1j9/iXvOcp7pXP+NI9/tPO9L97lOOdP/tiKe4Xzv8SPdLhx7pjj7kSPfCg45wzz/wcPectWvcUWtWu6euXuWOWHWAO/B/vtWtueERt+6efe7FP3jc3bTMe8UBAAAAAAAAYBz4YHvdQQe7N2zYUNhm8XX9PqMOxRsMxJfd3m+90e374r+5vWde6ba+5u3u1c9+qguXXz/8SPfiQ49ws4cc4b55xZXu/f/4LveT63wgfoh72upV7shVq9xhB6xy6/7s/3WrFx90a2/+kVu327nnXvO40t9glpcX3fzsjJuZyZudXyzUHZasz9l5t7i8XNgOAAAAAAAAAJPAB9wHrF4TFYrXqTtsjQXiD959ldt3+dvd3nO3ucdPvs998vff4l759CPdX//ubyVh+Fte82r34sOOcL94yOHuvx58uFu84kr3vn+cd89bd5h71tpD3dPWHOgOW73KHbJqlVt73Fvd6st/6NZc87Bb++nH3Av+5dFCf4NYXphTw29fLsuqLC8vuLn9bc0t5ANurZxAHAAAAAAAAMC0iAm6Y+o0qRuIL+7/w6cTskK/fvTdU9y+z53m9v7tl9y+3/2SW/jpt7hjj/px97qf+5kkEP+TX/0V938fcrj7+YMPcz9z0GFJIP5v75x3P7b2UPeMtYe4p6451B16wBp30AGr3No/fJtbfe4Dbs27HnVr3vYj9zsnD+8XbGah9NxCYVs/lhfn3awWiBvlAAAAAAAAADAtygLvsm2j0lgg/vgbz3DuN77l3G/el/j0f9nk/vQZL3B/9XO/ngTic7/yq279wYe5nzvoUPdfDjw0CcTf+85596w1/unwQ9yRqw9xh6062K07YJVb/dK3uTUnPNrxzkfdX5zzUKG/fqVPbhOIAwAAAAAAAMDgtOBbK2tDY4G49+AXr3J7//wNbt8vv9996j/9uXv903/Kbfrd1yaB+Amv/lP3q4c90536r+9zf3XscW55zx735v/1BnfU6kPcU1Yf7I5YdYg7ZNVB7sAD1rkDX/I2t+bdj7g17+k48csPFvoaxMKcf1/4rJtfrA6r02A7e8948LqTTjvC3IJZnu0j2/Droh/t1S1ZmJ/xx9Apk/ULYxjSXwAAAAAAAAAAgBQG4OMShnu5QPyCC84oVBjEQ/ee7dzNT3fumqe70/7gWe6lTz+i89s0u8srj/pZt/1zn3d7H3/cffnzF7ufPPIZ7umrDnZHrj44eTr8oAMOcmufvM49b/1Gt+a9D7vV/7rfvz3stlzzw0Jfg8gFyyXv807D8DRs1l63Yj0JbpWrgbgYR/qO89z7x9PAPOw7OI7CGMP2fD0CcQAAAAAAAAANSoPwcQnDvQsuuKCpQHy323vjerfv8sPd3jMOd6f+98Pcf/vxA92vHXWge/ERh7pfOvgp7hcOfJr7+XVPdy9c+zT3/LVHuGevOcQ9ddXB7vBVB7lDDjjYrXvygW7Nk9e556zf6J76jh+51R96KPGVW4cbiKcW52d7T1CLYFwLv5PyJKzuPV1uBd9WuR6I559W1/qW+8l+eoF48Zd5AgAAAAAAAEDTVlQg/sg173L7Tnmmcxue4dwf/IT76KuPcL/2nHXul5651v3C09a6Fx2x1v3swQe5n157mHv+6sPd81Yf5p61+mD3tFUHuUOfnD4dfqBb/eR17shf3OjWvvVHbvXmh93qUx9yt91X7G+YesF4/aBbrlv1UjLYlutavTTklq9FSfoR27IwPfKVMAAAAAAAAAAwqHF9ZUpjgfhDXz3X7fuzFzr3B89z+37z592/v/YI98vPXut+8ag1bv1T17ifPXyNe8HBa9x/WrfWPW/1Ovdjqw5xT1/tnxA/yB266kB34AH+6fAD3aonr3PrXrzRrXnHo27Nux51R5w+3PeHW7LXj6QhtHx3uDCugXhu/3S8vC4FAAAAAAAAQEO0AFwra0Njgbj3w9tuco/9zZ+5fcf8hvvQK45wv/isNe6XnrPanbbhQHfvGQe7vZ+rZ+m8H3fv//Sb3f17lgp9NaHzpPicWwgCcRloS1Y9q1wG4HJdq2eF3kk/JdvCcWh9AAAAAAAAAMAgyoLvsm2j0mggntiz7H70zj91H/idZ7ijn7nGXf2J3ygE3XU9tPimYj8N6DxV3Q3Elfd4a6zg2yqXAbhc1+ppvygz66f7CzitQLxXh1eoAAAAAAAAABiemMA7pk6Tmg/E93vsnX/oPnDMc92LjlrtHj3/OVmwfeZb17qNx65OfPW965Kyy/5lnTtn49rkz7sXDkq2nXDcavf193W2ez+68HmFPvrVeaK6E3rnypVgOS0LQ+1k/yCYtp7QtsplAC7XrXrpWMKAPnytS+6XaooQX7YFAAAAAAAAAIOoE3TXqTtsIwnE9/7F77jNv/J893NHrco96f3aX3uy+/vXrnKn/p817rp/PzAp+/WfeZL7qec80T1y7sHu1tMOcj/xjCe6k96wxj3ryCe45c8clO0r++hX9q7wAv0J6iyIDsinvnN1wsBaKZfhtFxPaeWF95on2+Uv1VSOT2kfAAAAAAAAAPpxxRVXuHUHHVwr4PZ1/T5+X7mtSY0H4g/ceIPbe9zL3Vd/+zfce1/0XwuB+FFHPME99+lPdDd89EC3+IED3a/+9JPc6485wH3yLWtzgbj/74Nn9/aV/aAjDcBlSA8AAAAAAAAATekn2O5nn0E1Hog/8r6Pu71/8Hq37+V/7h5+8cZCIH7G36913zv1wOT1KH/62we4X/jPT3K/9sInuV9+wZOyQNw/QX7jRztPkBOIl+P94AAAAAAAAACgazwQf/zV73D7fvsN7pGf/SfnnnKKe+zMH8tC7Q/+5Rr3x795QOKz71jr3vTKVe6xbZ1t//BHq5IQ/B2vX50Lwr3HPz+8d4hPqsX52cL7yLX3ngMAAAAAAAAAOhoPxB97yUb36NEfcQ+/9avuB5cvuUe++aZCwF2Xb0P2s9IU3h+e4MlwAAAAAAAAALA0HogDAAAAAAAAADAOCMQBAAAAAAAAACsCgTgAAAAAAAAAYEVIAvFdu3YkYTiBOAAAAAAAAABgWhGIAwAAAAAAAABWBAJxAAAAAAAAAMCKQCAOAAAAAAAAAFgRCMQBAAAAAAAAACsCgTgAAAAAAAAAYEUoBOJXX301AAAAAAAAAABTh0AcAAAAAAAAALAiFALxO+/ZAwDAyMh/ugQAAAAAANAUAnEAQKvkjQkAAAAAAKApBOIAgFbJGxMAAAAAAEBTCMQBAK2SNyYAAAAAAICmdAPxG/f/4ZyEDCoAAGiSvDEBAAAAAAA0pRuI70r+4MmgAgCAJskbEwAAAAAAQFMIxAEArZI3JgAAAAAAgKYQiAMAWiVvTAAAAAAAAE0hEAcAtEremAAAAAAAAJpCIA4AaJW8MQEAAAAAADSFQBwA0Cp5YwIAAAAAAGgKgTgAoFXyxgQAAAAAANAUAnEAQKvkjQkAAAAAAKApBOIAgFbJGxMAAAAAAEBTCMQBAK2SNyYAAAAAAICmDCUQv+P7S+6aa691l19+udu+fTsAYAXxP/v9PcDfC+T9IYa8MQEAAAAAADRl4EDcByCXXXZZEopcd9117tZbb3W33XYbAGAF8D/z/c9+fw/w94J+QnF5YwIAAAAAAGjKwIG4fyrQByFLS0uOhYWFhWVlLv4e4O8F/p4g7xNV5I0JAAAAAACgKQMH4v6fyvunA1lYWFhYVvbi7wX+niDvE1XkjQkAAAAAAKApAwfi/olA/0/mWVhYWFhW9uLvBf6eIO8TVeSNCQAAAAAAoClDCcT9e2RZWFhYWFb24u8FBOIAAAAAAGCcEYizsLCwsAxlIRAHAAAAAADjjkCchYWFhWUoC4E4AAAAAAAYd0kgfscddxCIs7CwsLAMtBCIAwAAAACAcTfyQHzfvn3uhu9+z5217UJ30mmfcv/0wY8m//XrvtxvZ2FhYWGZvIVAHAAAAAAAjLuRBuJ7lu93nzjz7CQE/+iWT7vzL/6Su+xrO5L/+nVf7rf7eiwsLCwsk7UQiAMAAAAA0Jzbb7/dLS0tFcrH2e7du929995bKG/TyAJxH3J/8NTT3QdO2ZI8Ca4tvtxv9/UIxVlYWFgmayEQBwAAAACgGf4799vf/nb37ne/e2JCcR+GX3HFFe4rX/nKWIXiIwnE/WtQPv7p/3DvP+UTbveeZbk5t/jtvp6vz+tTWFhYWCZnIRCvtrx8rdt8zIybmfE2uG3Ly4U60Flzt21Dt+yYze7aFTSf1nyM0jiMYdJNyvW7vG1D9zx7x7jN147vWFE0Dp/VcRgDAACTLA3DN2zYkDj99NMLdcbRtdde6y6++OLEOIXiIwnE/ZPf/nUoN9x0s9ykLr5eUt94kpyFhYWFZfyWcQ/Er918TBDo2I7ZfG1h32FpMxA4+eSTC2X9Cudyw7beMSwvb3MbwvncsK2wb7+0ucv3N7yQLgspPSWozPWrbB8FbT5knaaNegzDvIa9wvU64nPa1PU7bPkwfDRjnYTPYGoSxjrqz6pmHMYAAMCkkmH4P//zP49NsFxlz5497sorrxy7UHwkgfh/fO6i5B3hsQ98+3q+vt+PhYWFhWUyFgLxam0GAmvXrnVf/OIXC+X9sALxqmAoVhYgBYG6NXdNPGGbOw7lmhhWwKUdZyxrPkZp1GNo6hou6POclp1Pa1sT1+8w5c9x80F4alSfwWEY1VitayjGqD+rmnEYg+XMz11cm2wDAICmTHIYnhrHUHwkgfiHPvZJd+GlX5HFpYuv7/djYWFhYZmMZdwD8dCwAoq62gwEnvvc57qjjjrK3XjjjYVtdWmBeP4p0v6Pbfnaze6YtJ2IQLwJMuCSQeAwrh/rOGONcj4sox7DsK5h+WR4/l857D+mDfXPadn5LNs27oZxrfdjFJ/BYRnFWAe9hkb9WdWMwxgsMuyOIdsAAKAJ0xCGp8YtFB9JIP7efz/FffmKr8vi0sXX/5eTTkn+7N8rftnXdqiu+fYNYk8WFhYWljYWAvFqbQYC/n8+Dj74YPeiF71o4F/AIgPxsoCxLiv4GeXcFQMuOZbBrx/rOGONcj4sox7DsK7h3Nz3ef6ksvNZtm3cDeNa78coPoPDMoqxDnoNjfqzqhmHMVhk2B1DtgEAwLD5d2+/6U1vysJwH4x/5jOfcWeffXZtsu1huP7662v79re/nQThaSh+6aWXul27dhXaHoWRBOL9PiH+wVNPT/7sX6Fy3kWXJO8VD/3rhz/mvn/3PWJPFhYWFpY2lmkMxGXQW/ZFPqauFQjo+w7/9QRnnHGGe+ITn+he/epXF7bVIQPxMBCSrwtI6ceYnx81WPI2bFPnLq4sXJ8pPd/FcRyz/38+lafhS66fQY+zrJ1wbovHKeorx6m1KcdWp25xDJ1tuePrI7wrM4xrOBcuzlT/BY42F+G5KDufZdu0+SuWVV+/8h3fx2ze1tsnqK8dR9nPGfO1MpVtVlwn2Xj1a88b9mdQP1/Bz2AjcM7qKvNeqDOkscp5KbuGytqZ5J8Xenv2tTooH3B/47rrC+UWAnEAQNNkGD4o2f4wpKH2oC655JJWQvGRBOL9vkP8rG0XZmWPPfa427JwdhaG//OH+KWbLCwsLOO0TFsgLkMmKfeahci6WiAgw7meZr78v/SlL03aP+eccwrbYuUC8Q3BsQ84l2XBjzp3lWWGipA2DLg2X6v1oV8/wzjOpB3zmgjq1DzO2LHVqavOf7ivcT0MahjXsHYOtGA85lxobaXby7ap81fzvJqhdap7DuzjsH/OmG2nbfZ1nYT0cDU/pzU/g+ZxzmTz1juu3rHnjjU9vqAP6y/6Bhpr5PyVXUOxx2yfg2LdOmOrU1e93pWfF/bx2NfqoMJA3P/XsvOOO7P6sg0AAIbJB+JvfOMbC8F2v2T7wyCD7X75QPzOOzv32FEaSSDug2sfYt9w081yk7r4er7+9SLwfuDBB91Jp30y2eZfl8LCwsLCMj7LNAXi+afTel/C8+VK2FFZtzwQCEOGazdvGPqX/5NOOsk94QlPcK973esK2+qwgjItNKozP0l5GIbknoBU5q6yrDemfMhiB3FePuDKBzS+Pe36aeQ41fCsOybrOJVxaGXFusO4not15NwOaljXsJy/nvCY485FUmacz7JtxfmTc1p+/WrnxNdVw90+f85o13qhvNZ1ov+ckPr7DMadr7AtPXSW9cqD2P7GGj9/SXnMNVR2zMY50MahlRXratdgVV15vRfr5Mde71odRBiIy1ejhMI6sg0AAIZNPiU+ra9MaSMM90YSiO/bt899/NP/4d5/yieS94GXLX67r+fr791bfKTcvyLlgku+HP20OQsLCwvLaJapCsSDL+QyvJGvC6lVtxAI5Pe3xjMM/mnaAw44wL3kJS9xP/jBDwrb68gd1+YwqCsGR3XmJ6kfE/yYAYteZu0vjyslA65iWfH6GdpxhuWGTshmH4/sr87YatUVY9isHOcwDfMaTuWDu/x8xp6LpB3jfJZtk/NX9/q1zpX2863fnzNaW0m50bdXdZ2UffZSfX0GI89XbjzJk/rdto7Z/2WzW577LFTMVV9jrTF/vsy8hvo55jH/edHvtToIGXZbCMQBAKPGL9VszkgCcb/sWb4/eSf4B07ZYr7qxJf77f4J8M0nf9zdtcT7wVlYWFgmZSEQj6hrhBL6P4mPC45iHXLIIe6FL3zhUN7PJo8rXJfjrjM/SX0r+FHmLrbM2l8eV0oLuPLXzDG9MQ474JJhkGI8A65Q+fz2a5jXsCSDcTkXlnEJxHOBYlg3+PnWz88Z62dl/9dJeX+pQT+DlnSsWft+3/T8bAhecbP/z9lxiPMpDTrWqvlL2rOuochjLjsHsr86Y6tVt8bPi36u1UHIsNtCIA4AaMM0hOLjFoZ7IwvE/eJD8U+c2XkPuH9H+PkXfyl59Yn/r1/35f7JcP9LOAnFWVhYWCZrIRCPqFsSSsh+ExVBTB3Pfvaz3Q033FAo70f5ceXHXWd+kvpW8KPMXWyZtb88rpQWcMljyTQYcMl2QmXHI/sra3OgunIM4fwM8dpNDfMa1oTHl4SIJXMhWeezbFth/mpev9b46vx8k2OSrLasvr3K66Tks5ca9mdQ6tXtPamcu/73t7m5O4bwLxs0wx6rnL+kLesaKmknVHYOZH9lbQ5UV44h4udFYQ6NeoOSYbeFQBwA0JZJDsXHMQz3RhqI+8W/PsU/Ce5/YeZJp30qCb59AO7Xfbl/TcoP9iwTirOwsLBM2DJVgbj1blOlXCuz6xZDCR8ahIGLFXwM6vLLLy+U9UsGHb5M/tP9NBzR5qG0PGwnDOCUuYsts/aXx5WyAq78tvwYzeOxys3jDOuLgM1v614T+eMJ5jt3Hvq5Rotldl05p/kxVQWJdQ3rGk7mSHzu88eXBnhx5yJrM60r2za2FedPm9OSusq59nXDz2faX78/Z3JzYF6nda+T6uti8M9gxfnK6h6z/1ro1e/NS1pePd7Bx1o+f0m5eQ3FHfMk/bzo91odRBh2xyAQBwC0QYbip59+eqHOOPLvQh+3MNzLBeLnn39+IaioUjcQj10IxVlYWFgma5mmQDypI59ME3Jf2CPrFgMB+boRfb9xowXisjz3+oDI+Unq5oKUrg3+Pb/FuYst67Srl2vKAi4Z/FtPzWpijrOyHSPg0uSeGi5rc2Z417MWsIXzNw4K51AynsAtUAPW4nZrmzp/SlmnDb28ELhKQSBe2NZV9nOm7Gdl6dwE7VpjL9PIZzB3vsTnJwuq9XI5vsbHOrNyf170e60OwgfcF1/29SQUj0EgDgBoSxqKv+c973FLS0uF7eNo9+7d7oorrhirMNzzGfhYBuJ+CUPxM887X25mYWFhYRmjZdoC8UI98aW9n7paIKB/+df7GBdWIF4MXYx36lYcZyFEqhEeamXFsen9psoCLk97Ajcb+4DHaW4T4ykcjwiltOCo1tgi6hbG0N2Wv6b19ttUvE571HmrOBdmvbLzWeOaLo45P6f5UNyPK6hbGohXn5uqn5WDXCdlBvoMyrk22gnbCMPgcD7la0A0A401Yv6yuvK4yq4vMZ7CORjjnxenvK+/a3UQ8tUoMWQbAACMyu233z4xYXjKh+LjFIZ7Yx2I+8WH4v/xuYvcI48+KjexsLCwsIzRMkmBOABMq1G8YgIAAACYZGMfiLOwsLCwTMZCIA4Ao7Vtg/Le6ODJWu3JXwAAAGClIxBnYWFhYRnKQiAOAKNV+g5xng4HAAAAVATiLCwsLCxDWQjEAWC09HeD6++yBgAAANBBIM7CwsLCMpSFQBwAAAAAAIy7oQTit956q8xFWFhYWFhW2OLvBQTiAAAAAABgnA0ciF9++eXuuuuuk7kICwsLC8sKW/y9wN8T5H2iirwxAQAAAAAANGXgQPyaa69NnghcWlqS2QgLCwsLywpZ/D3A3wv8PUHeJ6rIGxMAAAAAAEBTBg7E7/j+krvsssuSIMQ/Hej/ybx/jywAYPr5n/n+Z7+/B/h7gb8nyPtEFXljAgAAAAAAaMrAgbjnAxD/VKD/p/I+FAEArBz+Z7+/B/QThnvyxgQAAAAAANCUoQTiAAD0S96YAAAAAAAAmkIgDgBolbwxAQAAAAAANIVAHADQKnljAgAAAAAAaEoWiPs/EIgDAEZN3pgAAAAAAACaQiAOAGiVvDEBAAAAAAA0hUAcANAqeWMCAAAAAABoCoE4AKBV8sYEAAAAAADQFAJxAECr5I0JAAAAAACgKQTiAIBWyRsTAAAAAABAUwjEAQCtkjcmAAAAAACAphCIAwBaJW9MAAAAAAAATSEQBwC0St6YAAAAAAAAmkIgDgBolbwxAQAAAAAANKUbiF+1/w9nJGRQAQBAk+SNCQAAAAAAoCkE4gCAVskbEwAAAAAAQFMIxAEArZI3JgAAAAAAgKYQiAMAWiVvTAAAAAAAAE0hEAcAtEremAAAAAAAAJpCIA4AaJW8MQEAAAAAADQlCcRvv/3rBOIAgFbIGxMAAAAAAEBTCMQBAK2SNyYAAAAAAICmEIgDAFolb0wAAAAAAABNIRAfgl1LO9ymo2fczIx3vNuytLtQBwCgkzcmAAAAAACApkx8IL79hNluEF1u/Qk7CvsOC4E4APRP3pgAAAAAAACaQiA+BATiANA/eWMCAAAAAABoysQH4qFdSwvu2DQEP/pEt31EwTSBOAD0T96YVoKFufSeMecWlpcL2ydZcmyz825xxMe1vLzg5vbP6ez8YmFbjCbPSVtzguGre501eV2NE65xW91rZhRW0vlanPcPT7X7+UvGsELmGwCASUEgPgQE4gDQP3ljGpXOl+T0Z3dq1s0vNvuFVX45X15edPOz0xNOtBW0DBI6yXMybG3NST+m7XoctjrXWdPX1TiZpGt81GKvmeWFOfV6Sf9SpWr/OsLzNe2f+XH4HBKIAwAwflZkIJ6rl9GD7Ji6ViCu7zvrNl1Z7AcAVip5Y2paGk5oX5AX5poNxLPgYW6hWDZhX5bTeZxbkHPYzrHEhk6Sdk6GTc6JNXdNsfrTyif1ehyV2OtsFNfVOJHX+KTSPhODir5mlEC8U9b/eKzjmbRA3DqOGATiAABAs+IC8V1bjxcBdd6xW4OgO7KuFojvuvJEt17Zh0AcAPLkjalJWRjeUkiVBg9VwcgkWF6cd7MzxYCirWAsNnSSRnFO5JxYc9cUqz+rHLbY62wU19U4kdf4pGriMxF9zYhAPB1L1X5lrOOZtPNlHUcMAnEAAKBZUYF4/ontXjCdL+8G2rXqKoF4EKaHIfv2E44nEAeAgLwxNantL8bTFJJZAUVbQUts6CSN4pzIObHmrilWf1Y5bLHX2Siuq3Eir/FJ1cRnIvqaCQLx7C9vB5xT63gm7XxZxxGj7fu+RyAOAMD4WVmBeBBSrz9hR27b9hN675L1AXatuhWBuDUeAMDoAvF+X2GQvr+1p/jFOgsXul/a07phAJL+0/ec7li0cCILRDL+dS75YMU6Jq086yMdhxLQZn1VfHEvzolyLLJNZd7r9pvtlx5ftm9xbmL6KDsnxT5623Lb68z9/n7L5s5S2Ef2WXKMhX27+1vlcry59ZLrOxtLxHUbe1z5dovzWlZe1XbZnBXajjiW3H4l15U5vrKfK8pnVqp1jkqOXZ77sH7u55mY98I1row120fZptZT5q9sTsqOq6rdrO1wm9he1b7eR9w1k+wbBOKdsRSviVBxvPn6xe2945HnyFyPuJ6kuvsWxxl/HF7VeekF4tq50ee32Kd9LmLqaoF4ul84L4W2Sn4mAgCAwRCIdxVC7jp1lUDc19tynPifGrEdADDCQFwJdcpYT+h1vrDmv0hnX2LDcEZ596v11KgMI7Iv+OGX/iBo7DsQF22GfVW1KVlP7JXNRS5QG7DfqrmJ7cM6J37M+QBwCH8ZIc6vnDtJCxCTcShhUNm4rP6scjnesnOau74jz03McUnacWnlMW3XmbOqY7GY11U/P1dK5qVQN/IcWcfe2Sc/juwXEMs5DdoOrxmt37BvWa7VKcx7d92ak6rjSsoqPtNhO3KMUe1bY/dloh9NGojPJ/Nth7V1riHreNTPuFyX59w4r1LsvsM4jpjz0vsF2vp13feYatSVgbisE/NzCwAADBeBeFch5K5T1wjEtX4Txy0Uxg4AK5W8MTXF+kJtkQFB1o7yhVt+ubXqWSGZ7EuuZ/tHfPm3yjtjFL+wTamXlCuhmGTNZ8xcyPU6/Q48N6IP65xowr7N9pVyOWZr7iQZOkpaX0m5PEajP6tcjjfmnGr7yX5656b8uDRaf1p5VduyflYu5iz2WCzWdWW2q4xL+8xaYs6RXM/qBceuhcS+7bl5f9zB+6274W26HvPZkKGgxpqf3PYh/hyT/Wmfidj2ZVtZvdhrphsaJ0RfIbMfZZza8WhtqOsV15Mldl/ZZ1ld7Ti0ekm5OC9a8G2NQa6X9VWnbnjtd8Yj56f85xYAABi+lRWIK+//tsq1MrtuMRD3oXnuF3SGv2STQBwAMvLG1BTtC7VFC4VC8p2k1hdjWR4TkpX1LbdpX7ytcjmWpJ4xJ1Z5TB2tH1lu7WuVZ9vrzI3Rliy3zkm4LfeX2tl5Ks5xbp+SuZdjsPT610M9qx1ZLteteik5Xrmu1ZPzn+tHnpuK49Jo86qVV7VtHXNYLseb78/elq9XvK6q9o39uaKx6vbzuUv2yebTj9nPZT6wk+G27F8eS9Wxh3Xk+EKyn2S/yOPq9GF/ps19lDJZXnZ8Zdty9dK/ZOi2q9Wvaqsw78bY5TxWrVv7aaw6sT8vvJjj0Mq0ctmW1U+dMdWpm63vP/YFI5yv+rkFAACGLxeIb9v2qUJQMUmqAvGkjnxaW8iF2JF1rUBc1pf7AQBGGIhXfIGtU7fs6ciwnizXQjJZr6xvuU2Ggb16xXI5lqReNziQ96mU/NKe68MII7R+ZHm//crjL9sW20fpORF95c9TcY7D9srm3po7SzqWhPLUpDy2wjEa/VnlcrxyXasn5z/Xj7HNOi6NNq9l5VbbMXNmjbfTn71NG1dYr2rf2J8rGqtuP5+7cBzJn7v7+7b82LVjk/2nx6q1Kceesq7HkOwn3E8ejzyuqs+0NYaY9svObdm2XL1gjqynmqvakvOsHY8nj7tq3dpPY9WJ/XnhxRxHzHnx9WQ4HaoTcuc+FzXq9vrpjq3kZ531cwsAAAzftm3bVlYgXqiXKb7qJLZufCCu9wEAK5m8MTXJ+qIuVX3ZlV+wrXZluRYkyXplfcttVhiolcuxJPWUkCGWta/Wjyy39q0ij79sW2wf2jmx9s2fp+Ich+2Vzb3VfpUsAKo5j1Y9q1yOV65r9eT85/op2RaOQ+uj10ZxXsvKrbatY863aY+3bFu+nnJdVewb+3NFY9Xt53MX1vP7Z5+pNBxPtuefZNX6D8uSPxvnSOtXbtParLOfVUe2p9XTyqSyc1u2LVdP+wsR49UaVlvyGrLGLo+7at3aT2PVif154cUch1amkW1Z2+qMqU7dbN0fe/e1ONZ+KflzS24HAACDm6pAHAAweeSNqUnpl8yqL6Oe9aVeC+CsurJcC8lkvax9pb30HbPh/rKPTj+dL+tVY9SOJZYVRmj9yPJ++60zN7F9aOdEOzatb+1YY+Zeaz9W+H7c6GM0+rPK5XjlulZPm5+sH+W6lcLjktu0/rL9lPmW6s7ZoMcStiHraceQ67Pkuilj1VXPUcmxe72xz7vO61LC63b/+nw3GA/60vrP5n2hu1/JuQ37LRuf2k/Eftq1rp3n0npl7SttZdtirxn5VHR6bYswV5uD3BiCcWrHo7VRtW7tp7HqyHK5noo9Dq2ephNOF68/bf86Y6pTNwvE99etdz0Uxw0AAIaDQBwA0Cp5Y2pa+mVU+yK7MCfDn2K95EtwZEAhy2NDsmyMSiAgv0inddOgIPsyLvaXfVj7d9pYcHNK3dx+xhNyVj+yvO9+B5gbrQ/tnGgha+e8lx9D7Nxbcycl9UTYU2gr6hj1/qxy2Ydct+rFnpuY49LIY9XmO6Zt2U62n1Kn6lgs2nWVa0Mca52fKxqrriyPOXavE+DNulnls6Idv+xH1pfbLOq8B+dU6yfczzqu6M+08Zmoaj+s0/c1k+yfvwa060Ur87RryDoeOY9V69Z+GquOLB/GccScl97rSpTPl+ynzphq1A0D8XBMg/5MBAAA/SMQBwC0St6YRiEX1OTIL+FKPeULqvXFVZZbIZmsl9QNgpRev3ookHs/6YwPB4pPqGl9ZH2lQU6ujWI9KbdfRWCllffdb425qerDOieyD79dO4Z+516bOykL8ULK3FYdY6FOGNgp5XK8cj2llct5085N7HFpquY7tu2oOYs4Fot1XYXbqsaoza/FqquV1zl2Of50/mV9rZ+wvmynjHYO0/6sfpL9Ko5Lnk/rM619JgrlSvtaH7WuGSUQ97JrPhhn7DXUazd/PPK4q9ZTVnlMHa180OMolHeF5yV7fYk8N8pc1x5TZF0ZiPfG1an/jT3Fa17WBwAAw0UgDgBolbwxwZYGRTKEAcYZ1+3KlYWRBHsAAAAYIwTiAIBWyRsTbJ0n4XinKCYL1+3KlD09a/wLCAAAAKAtBOIAgFbJGxM6T1XKf16f/rNwWQ6MC65bhHg6HAAAAOOKQBwA0Cp5Y4LyHtoET9hivHHdwrN+iSEAAAAwLrqB+PXu/PPP3r9yViGoAACgSfLGBAAAAAAA0JRuIH67O//885MVGVQAANAkeWMCAAAAAABoCoE4AKBV8sYEAAAAAADQFAJxAECr5I0JAAAAAACgKQTiAIBWyRsTAAAAAABAUwjEAQCtkjcmAAAAAACAphCIAwBaJW9MAAAAAAAATUkC8dtuu8197nOfIxA37LryRLd+ZsbNKNafsKNYf2mH23T0/u1Hn+i2L+0ubAcA9MgbEwAAAAAAQFMIxCN0AvFZt+nKfLi9a2nBHdsNxo/d2ttGIA4A8eSNCQAAAAAAoCkE4hGsQDy15TgfitvbAQA2eWMCAAAAAABoCoF4hKpAPHtS/LiFwjYAQDl5YwIAAAAAAGgKgXiEqkDc6zwlfrzb0n1FSrIevDIle41K+A5yJUAPX8PS4fvtlIXvK8/a33p8p163r5h+tp8w2x2r6Ktbr/DOdGWcneMtrwMAMeSNCQAAAAAAoCkE4hFiAvFeyGwE4luPzwXaafCdK0uD6CBcDgPyQiCuBNEx/XTG6vfvjTfte/3R+ePIyrv7a+9HT/ogEAfQJ3ljAgAAAAAAaAqBeIT4QLxXRwbiGllHrqdkKJ3VDYLrMrJdOdZ8m0Z59gR6J2APf4koAAxC3pgAAAAAAACaQiAeIT4Qt58QT9rRXmciguYw9O7tV9ymtR/TjzbWVEx5r+3y+QCAWPLGBAAAAAAA0BQC8QgxgbgMqNX1klBbC72z/pVtsv1ceUXdmOC7qjztR3ttCwDUIW9MAAAAAAAATSEQj1AViJuvNEnD7u52+ZqRYQfiMf34dS3g7qc87FOOBQBiyRsTAAAAAABAUwjEI5QF4tovmfSqAnG5n1zP9bH1+MqnvnvjLO/Hl1kBd93yrI9kfPr8AEAVeWMCAAAAAABoCoF4BCsQL3s6Wnv6O3y1SPbKkWDfNPgO62V9xATikf1YAXdMedKHeEWKNhYAiCVvTAAAAAAAAE0hEI8QhtJ5xZA8JUNi2YYPt2UdrV5ne9wrU7T9tX5igm+rPAvdC2PU5wEAqsgbEwAAAAAAQFMIxCdAGkLLd4MDwDSQNyYAAAAAAICmEIhPAN7RDWCayRsTAAAAAABAUwjEx4h/NUn4WhRP+4WaADBN5I0JAAAAAACgKUkgvnPnzuQPBOLtku//rnpPOQBMA3ljAgAAAAAAaAqBOACgVfLGhGYsLy+4uZkZNzu/WNg2SgtzM25mdt4tLi8XtoXGZbwAAAAAgOlCIA4AaJW8MTVteXnRzc/OuJm5hWQ9CWhn5tyCEdCmwWxaf3lhrvMveCJC3U7bM25uobzeKMQGzNnxiX+tNL9Y/xiyuQ7mikAcAAAAANAmAnEAQKvkjalpMhBPA2ArtJbbw8DY2ieptzjvZiPqjUpswNw5vvxfEHSC/fqhOIE4AAAAAGDcEIgDAFolb0xNKwTi4glwST5B3gmMZ91s0IZmcX7WzczOJqH4pAfisfvGIBAHAAAAALSJQBwA0Cp5Y2qaDMQ9GXr36hbD8jQQn5/v/ld5aroX5s4n/yUQ7yEQBwAAAAC0iUAcANAqeWNqmhaIy9ei5MvzoXevzA5se6Fyp45sV8rG5MP3lHj6PAuSg1exeGr/hfbKx5vbVwvEu31mr41R5tAqlwG4XM/t18d4AQAAAACog0AcANAqeWNqmhbaak+Ce2p4G4TkyWtRZHgctJ+2WxmI728zDH61p6PTX9AZjkcL8rN3l2vHFxEwy0Bcn69imVUu51CuDzre0NVXXw0AAAAAmALy+94wEYgDAFolb0xN00JbT4bbWiidlAeBuHxyOtmelHW3RwbiGhkca7/YUjsWuV9WtztWeTxS+EtD809sl/drlcvxVK1nbUWONyT/BwoAAAAAMJnk971hIhAHALRK3piapoW2Sbl8LYjyuhStXAa6yXq37TqBePG1IUq7SnAcllshfjgWbVuuXskrU3rHZcyhUi7HPezxAgAAAABQB4E4AKBV8sbUNC201cplkJvVE4F47olwGapHBuLp61AKr0gxguTCvkMMmLVA3Os8QZ8++R43h54c97DHCwAAAABAHQTiAIBWyRtT07TQNtV7bYodxhYC8aC9ZP8g/I0JxGWInioLkq16ZSFy2bZcPSMQz70qxphDrVyOe9jjBQAAAACgDgJxAECr5I2paWUhdRZOz+mvS0nqKK9SSctmZ/MBbllfhT7D95CnwbIRJIf75wPm4n5Zm913g1cFzFYgLt+xro0nPd74QHzw8QIAAAAAUAeBOACgVfLG1DT5FHco9x5vq44WiKdBsHz3dkwgboXIYgwyWM7VDcqzX4oZtJe9AzwiYNYCcS2cTst6r4cJ5k4eS8lxDDpeAAAAAADqIBAHALRK3pia0Ausi6G11HkS2g5itUA826/wCpHqQDypFwTAad8yOJbrKa1cttfZHvcKkiygFrRjSOeqV6feK1OGMV4AAAAAAOrIBeKf/exnC0EFAABNkjcmAAAAAACApvgMnEAcANAaeWMCAAAAAABoCoE4AKBV8sYEAAAAAADQFAJxAECr5I0JAAAAAACgKVMXiF93w01u19LuQvm42HJc+kvDjndbgnFa5QAw7eSNCQAAAAAAoClTFYh/7RtXuxNOeKf75NZPDzUU33XliW59ElYXrT9hR7H+0g636ej9248+0W0PxrH9hFk18LbKLbu2Hl85hipZG2KMmjSsP3ZreT0A6Ie8MQEAAAAAADRlqgLxa779HTf/rne5TZs2DTUU7wTis27Tlfn2di0tuGO7oXQYFmuBeFZ23IJoQy+3pOF82l+6XjcUD0P1sqA7/MuAsnoA0C95YwIAAAAAAGjKVAXiXhOhuBWIpzpPUNvbkza6wbcMrq1yS/I0uXiqO+k/MlBPdQLxWbe+Iozv9DebC+EBYJjkjQkAAAAAAKApUxeIe8MOxasC8exJ8ZJg2Qq+rXKLfL2KfMI8HUtVe2kgvumE7n+VY+u1dWLyXwJxAE2QNyYAAAAAAICmTGUg7g0zFK8KxL3OU+K9oDpZ7z7JLd/5nThuwSyXbefGIgJv+XR6bMCeBeJX2gF6p44/pk4dGYgX3q2uPbnuy5T3lYevm+mwx1LVD4DJJm9MAAAAAAAATZnaQNwbVigeE4jLJ7fDQDxpwwiqrfIyuYBYhMNp0CzDa6kXiO8ujL3TTu/Jc61N+e5y+aS6l/4yThnyZ+MPysOAPJyLmH4ATDZ5YwIAAAAAAGjKVAfiPgD/2Mc/kQTiPhi/4Xs7C3VixAfivTpNBeJpyOzD6ewJ8zBYjhhrUi8IxOUv6pTtyEDcCqXDNntjzQftWbnylHds+C37ATDZ5I0JAAAAAACgKVMbiPsw3D8Vnobh/mlxWSdWTMgsn7KWoa8VfFvlGhm6d/bPv79c+6WbGhkqy/GGv6izEIgrAbpWLtsM29KOV26T7Vn9AJhs8sYEAAAAAADQlKkMxIcZhiftRQTiMvyV61bwbZVL1tPSnW1pYG2HzZIMxHNPhIvA2QrEC+8/7xp2IC7bl/0AmGzyxgQAAAAAANCUqQvEhx2GJ21WBOLyVR+eDIOt4Nsql2RYLPV+QWfxFSWaQiAeBO7yKXMrEK8KpOUchG1pxyG3xfYDYLLJGxMAAAAAAEBTpioQbyIM98oC8SxIFsGvDIOt4Nsql8qeEPc6r1Oxt0syEA/L1ovxFALxirGk5Bzk9lVe65KG+lkgHtkPgMkmb0wAAAAAAABNSQLxW2+9dSoC8Qu/cOnQw3DPCsSzV3oo4a4Mg63g2yrXyMA43L8TbttPX0tqIJ6+j1w8ZS4D8XAsuTJfr+S1MXLf4i8D9X2L44voB8BkkzcmAAAAAACApkxVIH77Xfe6LZ/cOtQw3LPfZV0MyVMyDLaCb6vcoo7FCJbLnqzWAnEvedJc7KcF4r028mMJ68g5yO0rjyOppwf6Vf0AmGzyxgQAAAAAANCUqQrEMdms4B3AdJM3JgAAAAAAgKYQiGNsWE+tA5hu8sYEAAAAAADQFAJxjJx/LYv1WhRZDmD6yRsTAAAAAABAUwjEMXKF94cneDIcWKnkjQkAAAAAAKApBOIAgFbJGxMAAAAAAEBTCMQBAK2SNyYAAAAAAICmEIgDAFolb0zTZtvVS+5VJ9/kXvahGwfi2/BtyfYBAAAAAEA8AnEAQKvkjWmaXLPzPvd7J33HvWy/l3/kZvfyD/dp/76+Dd+Wb1P2AwAAAAAA4hCIAwBaJW9M0+TdF92RPN39ipNvc6845fbB7G/Dt+XblP0AAAAAAIA4BOIAgFbJG9M0efPZnRC7EG5H+KMtu9xrPn5Hrsy35duU/QAAAAAAgDgE4gCAVskb0zTpNxB/2/lL7pHH9rr7HnjMvf6Tu0YWiC/MzbiZ2Xm3uLysrgOTbHF+1s3MzLmFIV/Pk/I5mZRxDktT57uOZAwraM4BAAAmBYE4AKBV8sY0TfoJxH0A7oPwffv2Jf7m3LuHEogvLy+4uZmZ0oBIBmZyHZNpeXnRzc9yLpsKSAf9nIzq/Aw6zknT1Pmug0AcAABgPBGIAwBaJW9M06SfQPyKWx/MwvCv7Xwot22gQHxhzs3MzrrZmRk3t6CHMzIwk+ttSIN8a8yo1lTgOmnnpqmAdNDPybDPj3VeBh1nG6xjidHU+a6DQBwAAGA8JYH4LbfckvyBQBwAMGryxjRN6gbiH/rq7iwMv+/Bx9xxwetSBgnE08Btdn6xNBST2+R6G5YX50tDfLRn0s5NUwHpOHxOQtZ5GbdxxrCOJUZT57sOAnEAAIDxRCAOAGiVvDFNkzqB+F+edVfy3nAfhu/d7x0X3lOo03cgnoRKs25+cbnzpHj3z7KeDMzkehsGCcTQrEk7N00FpOPwOQlZ52XcxhnDOpYYTZ3vOgjEAQAAxhOBOACgVfLGNE20QPw9l97rPnz5bvfKU3tlrzrtDnfzvY9mT4efc939hTB8kEA8DGXCp8VlPRmYyfVcveR95Kl86KTtlwZbYb/ZqyLmFgpj0fsp1i3WqQ7ArH6t8kIfcr/usWXblTmTemFdt89gfxn+ZfOZ/GVGsf3C+JQ5KDsnZePO5kQcf7HPTnm4r1TYp1tfG1uu7+623pyl78PPt1M4HjEee871vyBSxxw5t4X9YuZG++yJY9I+t4V2cuPt9W21qY2tMJfK+ZGs9q0xF8eq/BwxjiVmjE2d7zp1tUA83U+2BwAAgNEhEAcAtEremKaJDMTfePZdWei9cPVyVn7Otfdn5Tff92gSkMswvN9APH0HbxhKWU9OmqFcdz37xZxqwNMLmbSn0Dt96u3JADhkPSEaOxaNFXzLchnIZv0qoVw6v7INSzYfxjyFx5sFb4Xxxs9B4VxGjDsLHMOy4PitcyNVzWPneim2I9vvzVnv2s2OYzZ/Tcvjy+9fPef9zm3VsVrk+cnOediOMU+SnLdcH0abub+oirg2NGXt9zu31rHEjLGp812nrgzEtToAAAAYPQJxAECr5I1pmshA/E/OuDN7Lcrje/e5vz3vbrfpwnuSV6T4Mr/tDWfdVQjCBwrElXDaCpnUUK5kPWuvECQXQ3i/79y87zcILZOxFYP5XNuRY7XGorHqyPKqwF7Wz8qVOZe0UC4lj60TohXnSdZLaeMK62rbk/3EuK32s/rGuZH6nUcZJnbmrDivVsgox197zpVj18aan9vyY7XI/rRj0vrWWOclpk25ntWLuKZj2s/qRc6tdixavaRcjHEU57uqbngNW9cvAAAARo9AHADQKnljmiYyEPdO+/qe7GnwO/b8KPnlmem6f5WKDMEHDcS18EYLbrS6WtBnvf6gE/b0Qttk31yw7IOgfFgoA0+NHojVG4tkHb8sz9aNEEsbW1l5qGyMcps8L0kfNecgdy6N8YXlMcGu1Y5UNY+eHK92fLJO3XK5btXV+rbq+vX856T6WDXyHMt1q57GOi/WvnWvDdmf1o5VXndutX61Mq1ctmX1U2dMdepm6/uPfSEpL44ZAAAA7SAQBwC0St6YpokWiPt3h9949yNZCJ762s6HCgG4VDcQz/5pvykf2slAq06QJZ/2DteTP3fb8W36NtLg0Gova1cJv+qORZLBd1V5Mg/pnClPrxbntaMs/JLBWdk2eV6SvmvOgRZ6yvGG49bmXYqpE7LmMWlLBPBy/J6cl7rlct2qO8jcpnXKjlUj25DrVj2NdV6sfeteG7I/rR2rvO7cascSO8Ymznedur1+umOLuA4AAAAwGgTiAIBWyRvTNNECce//Oeuu7NUpnn9K/LhP7irUk+oG4mWBUBoqhcGODLTqBFmyrzDISkPwpDwNx5Pt1U/RqoFYzbFIVvBtlWfb0yBOhIdlIaGlbIxymzwvXt050ELPsnEPq45GzmNaHo4x+bM4D/KY6pbLdavuIHMr61rHKsk25LpVT2OdF2vfuteGJar9mnOrjUcr08i2rG11xlSnbrbujz0Jyu39AAAAMFoE4gCAVskb0zSxAnEvfXXK3r373DsuvKewXVMnEK8Md9PtJSFc1XqhrfDp6ewJ8HnXeV1KGHDtX5/vPTUux5Zr2wi/6oxFo+2fPVFfsm/4nuLYvjSd4Kz4FwJam9pYy8qr2tC2S1F1jHMTQ77vOVe2oP9liQwb65YPY87r1M32UY5Vkm3Idauexjov1r51rw1LTPvaekrrWzsWrZ5m1Odbq5sF4n5uCcUBAADGBoE4pt6W4/Z/OTn6RLd9aXdhG4D2yRvTNCkLxL33XHqv+7ttS4VyS61AXAmSJBnUyaBHrltPuyb1rEBydtbNhm2koVFkMGQ9kVl3LFIaTqXzE44rDbSSvkXoVpgT0U62nxKYhTphXXGs2vhln1k/NeZAthEz7rROLqAM5sQ6N1LMPHbqBedAOV4ZcNctrzPn/c5t7LFKso5ct+pprPNi7SvLY64NjWzHKq8zt9axxIyxqfNdp24YiIdjkscDAACA0SIQj7Br6/Hd/6GWjndbJihk3bW0w206eqb1cHjX0oI7doTzRyAOjDd5Y5omVYF4XXUCcS2ckeQT0TK4kuudfYLQMqWEYEndbnAkw580FCoL63PtpMFsMNakvMZYNL3ArGNuIf+EZzY/Fe3nxpe1VT6GLKxNw7VM8Zxp5yHrO3IOtDZixq3NQS6ENM5NVRtyLKmywFAG3HXL68y518/c1jlWqw1t3apn0c6Lta9WHnNtSFo7Vnns3BbGEn7+K8bY1PmuU1cG4r1xzRTaBAAAwOgQiEfoBOKzbtOVkxOopqHzsVt7Yx6bQNzP59Gzbr0YX1MIxIHxJm9M0+TdF93RCcRPvq0Qbtd2cidc923KfjB5ZFjbNC2UHEejnhcAAAAAKw+BeISJDMSvPHFkgXMdaSi//oQdIwuqR9UPgP7IG9M0uWbnfe73TvqOe9l+L//Ize7lH+7T/n19G74t36bsB5NnlMGv9m7jcTQp4wQAAAAw2QjEIxCID09nXJ25HNW8EogD403emKbNtquX3KtOvil5unsQvg3flmwfk2mkgbh4V/y4GuWcAAAAAFi5CMQjVAW320/ovAsw/3qS7nuyj1sIyrqvLAnfNxhu74bY2TYR4nb68e/dLrYT9p0EwGE7QT9WOFzcp/h+72xfMU7/tHdYr0xyDN3+w6fFZb3YvqrmNNfW/j6t4w9fJ/OVK/4xfx6M/qvOV9ZX+g56pV8A0x+IA5qmw9/8O47HOwzvvcu9ufkAAAAAgBSBeISqQNyTQatcz8LTXEC+4I7trqfb08A1C2iD+mnwLseiBvLGE+KFcaXBvRbmin6y0Dzcvxv2yn40aV9hqNwL+ZVxRvTly3IhtdJHeMxaG8l+xnx12iy+ez3mfGXHIAJ6AHnyxgQAAAAAANCUXCB+3nnnFYIK9ILYAhludwPV8LUg6XYZROfaV8LUXr+9drTg22rfCnhlPbleNiYtJNfqWeTxJGVl45R1I/uSx5QLxI02wifXZXudee+NxWpDHl/nGIphP4A8eWMCAAAAAABois/ACcQryKDTktQ7+nh3rHgNSBiWy32S7UYoLMutp6m1bXLfVD4cLj5NXdamDJq1NmUbVfWscFmra5Wrr00xAnG/Lo+rbB7kk+BhmZxbWS77BaCTNyYAAAAAAICmEIhHiA3EPS0ElUGpVHgXtdBWIN457uEE4tmrWUxxT9TL8s5T2PYrUrR1+RcU8jh7Yy6+KiUpjzxfsl8AOnljAgAAAAAAaAqBeITYQDytt/7ofBBthdOx21My9C7bZrVZJxCXbVoBr1Ve1lZIewrbajM3/ohj1NZlWfJn5TUs8lUpKatfSesXQJG8MQEAAAAAADSFQDxCTCCee4e4eOLYei1Ib9/y7SkzoFX2t0JbGdLK9bI2rbpWeVlb6vaIcVUF4rFtZed0q29DmVOl7UIfxvGktH4BFMkbEwAAAAAAQFMIxCPEBOLhU8ZaYJr9Ys6wzIfo6T7d7flwd//2IFBNf6mmfNI66VuUWU9/y5A2e/2H9gS11o8S8Frl2VhKwuWsjvYLKZU2c4F4+hoWGdqL49Hayr133NpWEnjHnC+tXwBF8sYEAAAAAADQFALxCFmYrfCBaCeEzQfm2mtAtPdo5wJVpZ9we/bakcI7rI1XkYTtdcNdLaSt+qWUKW3fsvLcdmOMKRluW23Kcvk+bz/fso5cT6V/waD+pUFufvPtZ2OuOF9WvwDy5I0JAAAAAACgKQTiE6TsPdyoj/kExoO8MQEAAAAAADSFQHyCEOAOT8xrUQCMhrwxAQAAAAAANIVAfIIQiA8PcwmMD3ljAgAAAAAAaAqB+AQhxB2c9YtJAbRH3pgAAAAAAACaQiAOAGiVvDEBAAAAAAA0hUAcANAqeWMCAAAAAABoCoE4AKBV8sYEAAAAAADQFAJxAECr5I0Jo7XjUxvdxs0XuVuWlwvbMFluuWiz27jxU25Hg+cy9npZXt7hPrVxo9t80S2FbaMwirkYBjmfcn0Qseegqbnyx7Jp06ZG2kZ75DUq15vGdTVaVfM96vNvGZdxAAAmRxKI33zzzQTiAIBWyBsThiP9EmtJv9zGfIlcXr7FXbS5uh7aNexgUzvvMddLZ9+4MLYpw56Lpsj5lOuDiD0HTcxVE21OC+1zNUnkNSrXm7RSrqtxuUbkfGvjGuX5LzMu4wAATA4CcQBAq+SNCcO3fMtFbvPGje5TO4pfFGO+RGpfgjF+ZHgxKO28x1wvnX3jwti0nnZtDmLYc9EUOZ9yfRCx52DYc5VdN5/aUdgG/XM1SeQ1KtebYl1XTf0MaVNT10idudLmWxvXqM5/lXEZBwBgchCIAwBaJW9MGL5BA3FMhmEHm5rY6yU2jC27NgcxirkYBjmfcn0Qsedg2HOVhmZV/WIyyWtUrjfFuq6a+hkyjerMlTXf0qjOf5VxGQcAYHIQiAMAWiVvTBi+si/BfImcHsMONjWx10tsGFt2bQ5iFHMxDHI+5fogYs/BsOcqNkjDZJLXqFxvinVdNfUzZBrVmStrvqVRnf8q4zIOAMDkIBAHALRK3pgwfGVfgrMvkd062TvGxT9L175s+rLce8krXpHQC946QZ3cLx2nLE+lX9CtPrUxhvtp27R6Wvtl23J9GGOW5VVzV5iLirF7vfnNj3Xjxs3uolt6+1pj0srlnMr1cL98f9VhrJwDbR5kndjgNnYuUv3Md7JfyXVRti0l51Oux45N9hV7DrxhztXyjk/ljtc65tx25Zxm89BtL9dHSf8Wrb2b99xcuN6T9ss+B6JvObe168nzXrFfZ3zi52eNc93Zv/y6rJpfc+yijtW+pnJMxnUl+ynsF3ssynUmWZ8TT95bq9qV4y79DAz4syCdE9lnWh7um7VhzLc2LrkeO045HmssuXEZx5Ybh+zb+HxrbYRj09rSPl91Po8x8wIAGB0CcQBAq+SNCcNXFYjLL2bpl+Hwy1z4pTcLjMJ9/JfCii+0PlDofGHsfflPx7Z5s/jlXWl5MAY/rty6eAI2Hbc8zrLjl3VyYUpwTJV9KyGaVh4zd/LYZRuW3vzmg8y0PD1+qz2tXIYdct2ct42d60oGApJ1btI2ZGCQ9G8EtaHYuQjHUHe+zWOPvGY8OZ9yPWZs5jgiz8Gw5yotk/3WOafZzyV5jUb0r9Has/bVyst+TobzU6eePO8x+w16rs3902s2Yn61safrMT/fNDGfFfO6sn6GRB6LvC4sdT4nVrt1PwO5eYw4ntjzK+dKY823HJdcrxpn39dIxbGVfYZy11HEtVbWVr+fx6p5AQCMHoE4AKBV8saE4Sv7Eqx9Ede+qOVDj84XPq29Mj44kH1lbVvlIjiQ1DBGfMFM+q3RjtxmielbllfNnayfle//Mq7NUUgLZlL9jFXuF7OetSW+/Fusa9NsVxmjZuC5iJhva4xl5D5l67Fjk21k9SLPwbDnKjZIy/ZX2k3qiqdmtXpa/5pa7Snlnf0jf07G1pPnvY/9srqR59ra3+ovKa+43vLXSPnPtzpkP9Z1pf0MqXUsytPZmtjPSVm7sl5KG29+Xovbk/2041Haz+orc2Wx5lv2UXec/V4jsl8p9jOkkW3HtiX3y+pGht/y/AEARotAHADQKnljwvCVfQm2vtDJcvVLb80vcj5Q0EKCOuVp3z6YSIXjlPtoT39JsV/Qy/o2v/CK8qq5s86VVR6Sx25tk2PK+lDKy68De27LtuXqKcdVtW/ZccbUyc2F0r9nlWfbh3DN+O2l82uMISwvm6uybaFhz5UWpFWNRY5BzovWT1V5SG1Pud6tcm1/rVyux9aT69p+ZXNYtk3WsebJmkdZLsc6jHtD0k/FZ0W7rpJyZdxamVYuj6WMvEbLtmntVp2jsjbkuLM2lZ8Fso5VX26TrPmWx1Z/nPWvkZhjk+MqK6+61rR9ZHnZ+ZTbYuZFtgEAaB6BOACgVfLGhOEr+9IV88VPW0/Lsi+TFU9gefILf93ytL/wC6gcl/zi3HkCq9h2qGx+wn7K+tZCtKRto9yau3Qs4Rf1UNkY5XxZ26wxaeVyfvsNBCza3FftG3NOo+eiz/nWxi1VXTNV6zFjK5ursm2hYc+VFqRVjUWeUzkvSZ3I/jVqe8r1bpVr+2vlcj22nlzX9iubw7JtWZ2KazZ2fuVY5Xpalu4n51cT81nRrqukXDmufo+lTOznxGq36hyVfQZijkebBymmTlbXmG95bHXHGbaTllddIzHjluOyymOuNbmu1Ss7n3JbnXkBAIwOgTgAoFXyxoThK/syGfPFT1vX2re2p2RoUKfcOgZtXGFZ8ucBv2xb2/NfjoshWrKvUS7bloGC7CuGNY9ymzUmrVzOb7+BgEU73qp9y44zpk7MdVWlaj9re9l8ynWrjVw/JXNVti007LnSgrSqscgxyHlJ2ojsX6O2p1zvVrm2v1Yu12PryXVtv7I5LNuW1amYv6rtKTlWua61aW0P68h+ZbvadWXtr5VpZB9l5DVatk1rt+oclbURczzDqpPVNeZbHlvdcUqDXCMhOS6t3GpH7ivXtXpl51Nus/oFALSLQBwA0Cp5Y8LwlX0Zi/nip61LMe/ClF/465Rrx5AFVzJ4SMeyw+9TPqZcOxWhdVXf2hylX4yttpM6uferlo+lTGe+isertRk7VlkvHwgU5yBra0fxl5lptLmV/eTqK8eiiZ0LuR6raj/tuLT5ksepzq/Rh9Vmti3yHAx7rmKDNFm/7Lqz6sXS2rPKYz4HVrlcj60n17X9Bj3XVfNXtT0lxyrXpap7Q+xnxbquSveveSxlYj8nZe1a5VVtaNulqDrKXFms+ZbHUHecmsprJKJdOS6tXDt+7VqLakvZL2tTfB5jxg8AGD0CcQBAq+SNCcOnfQlMxXzxk+tJYCS+2Mn6mk6gUB58W+VWSJX8c2vRb/rlU9tmSb/Ahu2nxxnbd9pGOs+5cXT3jZk72U62X8Wx+PlK+hJzmbQvymQf2li1scl1dd6611tVQNfpV3/KznpqUDsWzSBzkZRFzLd67DWvGTmfcj1mbOo4apyDYc+VFaTVOadyHur0r4ltL/ZzYJXL9dh6ct3ab9Bzre4f/EyS85FtLxlruB7z802K/ayY15X1M6SPYylT53NitTvIZyDmeCrPrzFXGmu+5bjketU4+7lGwnatY7PaKFyfEddaTFvmmIzPY9W8hP0AAEaDQBwA0Cp5Y8LwNRKId7/wpbQ2pJjgu6w8/KKZftmU4wz3lV9Iq2jHlQVlkX2n/fb2zz8ZpvUh20jqdb88a2OxZPMlxqrNbcxYPXmMcj0Zq+wv2V4jeAmONR929MLJsrnS1J2LfuY72U85n3Wumar12LHJvuqcg2HPlRWkhdvCfeXxeto8xPavKWuvn8+BVS7XY+vJdWs/b5Bznexfcs0m2yvmV44pXNfaluPXyGPSPiul15X1M6TmsZSp8zkpa3eQz0DV8XTaL54D6/yGcyVZ8y3HJddlH3IM2vjk/hZt37RdbRxaecy1JtettrT2Otv1z2PZvAAARo9AHADQKnljAoYhCy8ivmQDwCRLg0LCteaM+p6iha+YDHweAWAyEIgDAFolb0zAoHhfJ4CVxD95urHkHcwY3CgDce5hk43PIwBMBgLxCLu2Hu9mZmZUx27dXai/0uxa2uE2HV2cm/Un7CjUBQBJ3piAQY0yuACAUfE/26zXMMhyDNco7ysEqpOBzyMATDYC8QidQHzWbbqy+fB719KCO3aCgvb0Lwtk+O3LZdmkm7RzA0wKeWMC+pW+C3hUoQUAjJJ8X3Hn5x3B6Sg0HYjnfqEr53Qi8HkEgMlGIB5hpIH4lSe69RMSumZPhh+3UNg2jSbp3ACTRN6YAAAAAAAAmkIgHoFAXJc+MU0gDmAQ8sYEAAAAAADQFALxCLGBeBqYZu/RPvpEt32pt4/6ru0gTN5ynNjW3W49ia2VJ234ftP3ngdjqBqfOoaKsLtTv3xutHGWl3eD9oxvv1MmX8NSq+4Ax18oD7bFtF12XoCVTt6YAAAAAAAAmkIgHiEmEE8D0TSE1cJe+V7tNMzNlSlPIWttWeVZcCvrVowvWw8DdD++ikA8F0gbIa/sq6w8C5bDsqAPba7q1B3k+LVzE9O2Z50XAATiAAAAAABgdAjEI6S/OLKgG55qAWhvv/IgPXtyWDzFPVggfrzboj2ZLvcPxjfoL4zcfsJsYV6yfqz+lXI5H1ldETrXqav1k5TXPP5a50ace+28AOiQNyYAAAAAAICmEIhHkOGmpAWlVnkWoCrBeuU+MnRVyrWQWGtTlvfGZR9njF4w3mtHG6dWrj0x36ub3ybXS+sO6fi1drQyrVw7LwA65I0JAAAAAACgKQTiEWID8cIT5F25UFSEuDIolUFqUhYZKGvt1RlfOMZEn6/3yF5bUvUE/YgDcXncdY9fPTeRbWvnBUCHvDEBAAAAAAA0hUA8QmwgLp8Sjqkjg1KtngyOy8ple1abVbKgt88Qt/OkeOcVIdo4kz5GHIgPevxaO1qZRjsvADrkjQkAAAAAAKApBOIRKgNxI/DN1VGC02y/itDV0wLV7EnsqkA8YnyaquMuI9+ZrY8rP35tPrK63fe4F94LXqfugMevnZvYtrXjB9Ahb0wAAAAAAABNIRCPIINRTRrC5sPSBXds9toQI7yWTyEbTz7L9nvvvFbaVIJXub86PhHqWm3l9ld+UaQMpLX+rfGn9XJlwWtJtDbr1B3k+GPPjWxbawtAj7wxAQAAAAAANIVAPEJMIN6r1w15u7TXa6TbfLCqBaW5doKQtvcLK9O2i08na+2p7YrxZYF9yGgna0/bJ6HPVcz4k3ble7mTcRhhdJ26Qzh+69yUte2VnRdgpZM3JgAAAAAAgKYQiGMipIG1fJWMpk5dAO2TNyYAAAAAAICmEIhjIsQ+pV+3LoD2yRsTAAAAAABAUwjEMVb8a1WsV53I8jp1AYwveWMCAAAAAABoShKIf+9733PnnntuQgYVwCgV3gme0J/2rlMXwPiSNyYAAAAAAICm+AycQBwA0Bp5YwIAAAAAAGgKgTgAoFXyxgQAAAAAANAUAnEAQKvkjQkAAAAAAKApBOIAgFbJGxMAAAAAAEBTCMQBAK2SNyYAAAAAAICmEIgDAFolb0zTZtvVS+5VJ9/kXvahGwfi2/BtyfYBAAAAAEA8AnEAQKvkjWmaXLPzPvd7J33HvWy/l3/kZvfyD/dp/76+Dd+Wb1P2AwAAAAAA4hCIAwBaJW9M0+TdF92RPN39ipNvc6845fbB7G/Dt+XblP0AAAAAAIA4BOIAgFbJG9M0efPZnRC7EG5H+KMtu9xrPn5Hrsy35duU/QAAAAAAgDgE4gCAVskb0zTpNxB/2/lL7pHH9rr7HnjMvf6Tu1oPxJeXF9zczIybnV8sbJPq1F1JFuZm3MzsvFtcXi5s8xbnZ93MzJxbMLajP1XzPm3G4TpKxtDAnE/zuZzmYwMAABhHBOIAgFbJG9M06ScQ9wG4D8L37duX+Jtz7x5KIJ4G1f2EZXVC7jp1R2V5edHNz7YbOIWBlzaeNoNMbTzTYqUFjW1eRykC8fqm+dgAAADGEYE4AKBV8sY0TfoJxK+49cEsDP/azody2wYKxBfm3MzsrJudmXFzC/VClzohd526o9JU4Jsea8x8Eoh31JmzOqx2JzFotI4lRpvXUYpA3Gad22k4NgAAgElCIA4AaJW8MU2TuoH4h766OwvD73vwMXdc8LqUQQLxNPD0IXU/wUudkLtO3Um3vDgf/RcMVfM+DkHmKNSZszqsdqvmfRxZxxJjHK4jAnGbdW6n4dgAAAAmCYE4AKBV8sY0TeoE4n951l3Je8N9GL53v3dceE+hTt+BeBLCzLr5xeXOk+LdP8t6ljohd526k84KtzRVgdc4BJmjUGfO6rDarZr3cWQdS4xxuI4IxG3WuZ2GYwMAAJgkBOIAgFbJG9M00QLx91x6r/vw5bvdK0/tlb3qtDvczfc+mj0dfs519xfC8EEC8TCgCp8Wl/W87PUZMykfnushd526Ui+4k22UhEVJmF8MjpLtwf5aIKgFTmk4le2nBFLFY9xvbkHps1Me7lvWv1y356P4lxfWfFhjjdlXjic59oj5KcxD1RyEdZX6xTrFcykV9+m1mx2XPBZlnDHHK1ntW9d/caz54ytuz4+1aox1riO7T3vOY+pqgXi6nzUvqbJrWF6jZXVDhTFXXXPBdns+iz+nqsZT6CfYbl1HcqwAAAAYjiQQv+mmmwjEAQCtkDemaSID8TeefVcWei9cvZyVn3Pt/Vn5zfc9mgTkMgzvNxDXnti2niLNwrYwgMt+GWe+jTp1NZ0x+Lr5oC4tD8OmLEgS4VDWnxq+5dsthGnd8afjzMIsLXyUx9hdt5721Mj+5fpQ5mNhLn+OlHNv7SvHUzU/2nvHw7mxWHNW51xqrHaz4w3H2f3LAO16to7XUtZ+OJY6x2cdS8wY61xHtcZUo64MxLU6mqrPW+Earbjeq67Rqu1erfmsGE9SZpzbsuuo6mcpAAAA6iMQBwC0St6YpokMxP/kjDuz16I8vnef+9vz7nabLrwneUWKL/Pb3nDWXYUgfKBAXHlFSmkoIwKvsH4hWI2sq9ECJavtTlhUDPBlvf+fvfvplaPL78N+X4yQV0Byl1eQGPHCOwIEs/YyEpBdGNCg5QheZRMoEGBLnBElURoJwQSSM2MlCgGBk9CZf5qRJvYIioeBhlbwaCEEQQCnw+6+VV31q9+pOnWr6/at5ofABw/r1Knzr/p5avDtmtONLCjs1s3OH64La1Vqv61fWMdMbCsen2M9MrXXzl2fJuzLxjumtGZxnG39wlii0Xbj578U7o/MN/Y3p/22XuX8srlk9Q7lYYyzP0eVY5pTtxuIH8czvoZTfdSej3WmPqNT5/fmrGcm1snubVuv4nMEAMB5CMQBuKj4YLomMRDf++f/y9+2b4P/7G//38OPZzbH+61UYgi+NBCPgcxeFrRkbzOWzsXjsbolpbfUs3P5HMb7GWujFEp1y2vCslI7mTiHeBzH2xXPxWu72nt70zHSbza+0rz669P0Uxd2Zm20ZTPvZSZrd+9c8439Ze2UyufOL+s3K8vKY1ulfuaMaU7d9vjz3N+OhMlRzb9v2VqPfd6nPqNT5/fi3KbOjY3ncL5wH7O5jZUDALCMQByAi4oPpmuSBeL7vcP/4uf/TxuCN77zV//3IACP5gbiTcjUC2d6TkHQWOgVz8XjsbolWZhUOpeFQlP9HN+czdtoQqnhehwdAt9CcNXro6JOI84hHsc5d8Vz8dpeH2FNYt14nNWrWZ/Y50HFm6zZms29l5ms3b1zzzeqan/m/LK51I4xfla65oTc3THNqXvq53ZsFZ+JQxvJnKO41jWf92690njGzteuZ+14SvOM9abKAQBYRiBe4eOb56f/oRw8ffPVoP6X4vWz4Xr0Pd+9/nT39fn46cPuxePP7Tx+tXu3oB3gYYsPpmuSBeJ7//D3/rrdOmVv/5b4s69/HNSL5gbiMbDpaoKZu4Tc8XisbsnY2OK5LBSa6mesjVIo1XWuOo04h3gcx9sVz8Vr90pjiXXjcVav1NaYNrBN2s7qzQnE4/wzWbt7a803a6dUPnd+2Xiyskxsq3Ruzpjm1G2P93OfsQd2zfxq7lnpfnT7mHM+zq2rt0aV46mtN1UOAMAyAvEKx0D8ye7F+/VD2Y+f3u6e3mwvaP/4/tXu0ZnHLRCHL0N8MF2TUiC+12yd8u///f+3+y//6N8NzmfmBOLZtijp+Ta06x/36oZga07dkmOYNNyqIBt3KRQqlU+1kZ2PquoUwq1MHGs8Xroe2Viy+5RdG8uzPmvE/awz2Tj3SuOqHcvcds8x39jOWHk8bmR9Z3PJ6mWWfo7OUbcNxPdrW/nfg6ydqHfPxtYoGWdbZ+IzGs/XrmfteLJ6e6X1LZUDALCMQLzCvQbiKwTL92Gr4wYuLz6YrslYIL73X/3x3+z+829+GpSXzArEC8FLr04If5rwKgvnYqg1p27mGDTt6/bfvjwEQFlZEgplb3TWttGMvx9gvd39p0md3hz3dZoQbOLN2a7Yfzxeuh7NWAYhZlif7NqsfGp9uutQaiNTWrM59zJTarc0plg+Nd/YX6mdUvmc+ZXmUjPGOZ+jWWOaUbcbiHfHFOcTTf371l3Tms/71Gd06vz+uHY9a8bTrRfXIvY7VQ4AwDIC8QoC8WlbHTdwefHBdE2mAvG55gTiMbDJZCFON9Q+hTl5iDOnbtRuNxDbSMY8Fgq1b2EOxjHdRhvAdcQvENo1KtTptVH5dmt2fI71iPdjfw9i3Xg81ubY+mTrEq8vKa1Z7b0sydrN5lUqH5tvSdZOqXzO/LK5DMqTMc75HM0eU2XdGIifxpXX7/cx/Fw184trOvV5z9rqXT9x/jTuuvWcGk9bL7m3Wb2xcgAAlhGIV6gNxJtQuP0fuWGrj3YLkG6dZ2/b8+me3J/Pt9d16vbai23s+232Pe+MYWp86RhCnyVjgXhpTFPr0bv2dpztcZjLo5cfBv1Ozbc0rtgOsK74YLom/+Rf/OwYiP/a/zEIt2f7tWO4vm8z9rNFbdB0T0GPYAmY677/OwUAwP0QiFeoCcSb8LUJZrOwet9ON7ht9gvvlSXBctZWqbwNtGPdifFl+3UfxneuQDwbU8V6pIF4CK+bHz3trdnEfMfGBdyv+GC6Jt//q/9r9x//Nz/Z/Uef/b3/9qe7v/erd/T52n0b+7b2bcZ+tug+g6a43y9Ajfv87xQAAPdHIF6hCVwH4pvOSeA7FaTHwDcLlovtJ+XHkPf57nX2Znq8vjO+pT/mmY27kY2pJK5HehzWNM4vHrf1wv2YMy5gPfHBdG2++b1Pu3/wa//68Hb3Evs29m3F9rfqPoOm4xYFwx/GAxhzn/+dAgDg/gjEK8QgNSqFwVl5uk3IuQPxsPVH1mYsP42rPM8xpT72sjG1102sR7w2Hmd9lMYSy0ttAfcrPpj4MqwdNPX3OxaGA/Ot/d8pAAAuQyBeoTYQH7xBfqsXwN6MbwkSQ9tDWRJ8l8pje3PG1x3jwYytRLJx99pMguea9Zg6zq6rnW+pLeB+xQcTAAAAwFoE4hVqA/EsDJ6qE0PZrF4WfJfKY3ulNqe0oXJlYDzWx5wxxbpTx9l1pbajUlvA/YoPJgAAAIC1CMQrTAbiSTAdZSFte91EIL6XhbfNvt+TgXjF+DJT8+7VLYx7Lx1TUj9bj3htPM76qJ1vqS3gfsUHEwAAAMBaeoH4H/zBHwyCCuqC4eaHN/sB79vd0zakLYTX4S3spl53G5Gs/d7e27HNJOSN16fjCwFyqa1MFnCPtVO7HvHaeFzqY2q+2TXAZcQHEwAAAMBa9hm4QHxCTSB+qncb6t7qBbJhb+t96J2Fsr12OoHxu5f7H/bptj18EzprL203jK8NqLsK7WTmBuLda8bWY+p4rI+x+ZauAe5ffDABAAAArEUgDsBFxQcTAAAAwFoE4gBcVHwwAQAAAKxFIA7ARcUHEwAAAMBaBOIAXFR8MAEAAACsRSAOwEXFBxMAAADAWgTiAFxUfDABAAAArEUgDsBFxQcTAAAAwFoE4gBcVHwwAQAAAKxFIA7ARcUHEwAAAMBaBOIAXFR8MAEAAACsRSAOwEXFBxMAAADAWgTiAFxUfDABAAAArEUgDsBFxQcTAAAAwFoE4gBcVHwwAQAAAKxFIA7ARcUHEwAAAMBaBOIAXFR8MAEAAACsRSAOwEXFBxMAAADAWgTiAFxUfDABAAAArEUgDsBFxQcTAAAAwFoE4gBcVHwwAQAAAKxFIA7ARcUHEwAAAMBaBOIAXFR8MAEAAACsRSD+wLx+drO7efxq9+7TV4Nz1+zdyye7m5vnu9cXnPdhDF/g2sOlxQcTAAAAwFoE4hU+vnmehrWH8PrmZvfo5YfBNXfVDcQ/fvqwe/H4fAH5cR7l9j5+ert7eub51BKIw7p+65vfni22sZb4YAIAAABYi0C8QhaIN+Hy0zd3C0+b8Dlefy+BeNLv4fzCQLw0pxoCcVhXDLtrxDbWEh9MAAAAAGu5mkD8Ox++t/v+j34yKI8+fvpq9y++/ce7f/vXfzM4VxID8Y/vX+0eLQiOu23E8HjNLVOaeTw9vNk+DJ8XB+KFOdUQiMO6YthdI7axlvhgAgAAAFjLVQTiP/jx/757+fIf7f7xL//yaCi+D8O//ua3dy9evNj9xtd+c3C+pBuIN6Hx0uC0FB7fRyD+upnDs7f98wLx1dYeLm0fcP/pd380KC8RiAMAAADX6CoC8W7QXQrFa+qUdAPx477h48Fts7f4Sb/+8PwpnI6BePH4Nnxurq8JsbvzOAbQT3Yv3p/GNRaID8dcP6dD22G8MXg+BeK328S0dftjnDOmuXWzQHyNfeLhErqB+P6fJT/+6c/a+rGNtcQHEwAAAMBariIQ3xsLvMfO1WiC5BdJiNyrV3h7/BiqhvC58DZ1MQDvHoc+avcz77/pPtyfPAvEzzGnuMVM23cnMD8G4sM2m/Jum7PGNKNuDMSzOrBV3UA8bo3S1a0T21hLfDABAAAArOUQiP/kJz85/OX3f//3B0HFlmTBd1YWr5vS/THKuM1IVwyv2+uTALgUHsc20uNB6DtsP1PaC70ZQxaIx/7H+oztleqdxnKaRxZ8l8YQj8f6mlO3G4hnb9DDlsWwu0QgDgAAAFyzfQZ+NYH4XgzA/9mv/8aiMPzQZhMkj/yYZhYmd8U9srPweC8GuFPHpesyMRBvr2vfGu/PIR5HNXPKyrLy2FapnzljmlO3Pf68hq9HwnnYqhh2lwjEAQAAgGt2dYH4XjcUXxqGH9ob7L09DEunwtcYRsdAuBGD7anj0nWZOIZDWWfccQ7xOIrtZXMa7B0enDsQz34AtabuqZ/bsU28bQ9bE8PuEoE4AAAAcM2uMhDfa0LxpWH4oa0QnObbloyHrzHwzcLjtu2RADwel67LxHk0TtuDzAvEa+aUlWViW6Vzc8Y0p257vF/D2y1yStfBFnXD7hoCcQAAAOAaXW0gvrcPxf/83/zVoHyuGCQ3QWsMcEuhdLZfdSkojm1MHZeuy8R5tOXtD2w+GWwJU2q3dk5ZvcwplJ/uZ86Y5tRtA/F9mC4U58rsA+4//JPvHELxGgJxAAAA4BpddSB+LlmQ3G4F0glbs7K94xvl4frC28sxwJ06Ll2XyebRnutsbdId0znm1ITL/aD8c91Om6ftSpIvGWI/c8Y0o243EO+OKc4HtihujVIjtrGW+GACAAAAWItAvEIpSG5D3G4o3rx5fBsux/PDdm/r3L6pHIPtqeNGqXzY33AevTaSAHjpnAblt7oBebt9yWDP8Xy8s8ZUWTcG4qdx5fWB84gPJgAAAIC1CMQBuKj4YAIAAABYi0AcgIuKDyYAAACAtQjEAbio+GACAAAAWItAHICLig8mAAAAgLUIxAG4qPhgAgAAAFiLQByAi4oPJgAAAIC1CMQBuKj4YAIAAABYi0AcgIuKDyYAAACAtQjEAbio+GACAAAAWItAHICLig8mAAAAgLUMAvH/4Jf+GADuTXwwAQAAAKxFIA7ARcUHEwAAAMBaBOIAXFR8MAEAAACsRSAOwEXFBxMAAADAWgTiAFxUfDABAAAArEUgDsBFxQcTAAAAwFoE4gBcVHwwAQAAAKxFIA7ARcUHEwAAAMBaBOIAXFR8MAEAAACsRSAOwEXFBxMAAADAWgTiAFxUfDABAAAArEUgDsBFxQcTAAAAwFoE4jxov/T93e2fn+9+6Rf/5eA8l/f3v/V3F78/hzH8/C93f/+CY+Du4oMJAAAAYC0C8QfiF37xO7tf/XkT/p7+/PRb3xnUPZe2zwcaJN5n0PoLr28Xv7AWv/CLP9x9a+X7MeYhj+8+71OJQHzay1/772aLbawlPpgAAAAA1iIQfwCasDOGmfvyWDalCUa/9bofDGblDzkQb8f2/R8Ozq2hDZyTtTucv2DgvLf2+LLPRy2B+DbEsLtGbGMt8cEEAAAAsJZDIP4Xf/EXAvELOXfw+wv/9C93P02CzVL5Q9Wsy10D3rmOgfPPd986bNEyDHeXBs5LrT2+JZ8Pgfg2xLC7RmxjLfHBBAAAALAWgfiFNUGmQLzvUoH4LxXux9LAeam1x7fk8yEQ34Z9wP0P/skfDcpLBOIAAADANRKIPwDHH478u92v/tPpMK8JLts/nRDw9AOUnT/f/2GxvL0mtrE/Dv1kQWsb5rd/9nPIg9nBGEa+AOhuD1KqP2gvCWTbuUzsv33q89jGMeDt349S4Dx5P0KfTf1uOzX/L4G7jq8dR+9Pf62G53e9sYzNce8UiMd98Muf6WGfw/s3p24WiDfXdddk0NbIml+bbiC+/2fJf/hffLutH9tYS3wwAQAAAKxFIP4A9ILlsdA2hKlZkFp607dUHkPbNjDslDUBdW//8SYk7fbdmcdgjN329vUmgsjSG+JtH2n42Q9g27lM9HVotxM4F8fcmdehbOJ+HNvsj+kYHudtx3uzeHwz1qr0+Zia4147p8Jc+/vWzxjTjLoxEI91imtW8dm4Ft1APG6N0tWtE9tYS3wwAQAAAKxFIP6AnILFYQiYBZGH8hC6TgWbsTwPxGMwOew7Xhf7OQWo02FvphSIF/stjTF5mzjTDZwPx2G9YuCc9Xdq57h+8ZpmTN/61r7tTl+h70ysMzW+pq/atYrtleqdxnL6jGTBd2kM8Xisrzl1u4H42Bv02Ri/FDHsLhGIAwAAANdMIP4AZW/cZoFlVh6PS/UaMXSMx1m9LHxt+ykFxyPbZ2SyQDy2HcW9rEtzycTAub2+fSs7zKuwnrH80Ebzxvihjf069MPZ+HZzZvb4Zq5VHHepLCuPbZX6mTOmOXXb489r+EuFcP6un8NrEsPuEoE4AAAAcM0E4g9U3C6iCSFLfx5qIN67vvlTsU3FXQLxGBqX5pKJ18b+Yt/V96O71cn+77fj2Y/t2O5wnpnZ45u5Vtnno3aOMZzumhNy97eFqa976uf2z8jna+7n8JrEsLtEIA4AAABcM4H4A9YLE5PAMlOqVyqPoXE8zuqNhZVj57rjyProtzMMiqfajsFsaS6ZGLD22zy91R0D8bieUbdeE4K3/e3Hdjg//dby7PHNXKtsPllZJrZVOjdnTHPqtsf79TysU/m6Ru3n8Jp0w+4aAnEAAADgGgnEH7D+lhjDfZMzpRCzVB5D43ic1WvHktQ7BrfjgWTcgzqTBeJ7pfFl61OqmykFzqe5/t1h/U6B87C/zGkef7k7bpfSDaA/H3/rNhifGOPc8e2V5p+NPft8ZPUyp1B+up85Y5pTtw3E95/Pis/goZ2Kz+E12Qfc//C//u8PoXgNgTgAAABwjQTiF3Z8EzYJOpNQrynrh5afr++EhqU3a0vlMXSMx6V6zViyUHX/p/emcghUY1uZUiBeerO3++XBnH7adguBc6/PzrxO14zfj71jWPt3u5/27tNtqBvaLLnT+GasVenzUTPH03YlyfrHfuaMaUbdbiDeHdPSz+E1iVuj1IhtrCU+mAAAAADWIhC/sCaIHP7J31xtg+jOn/jWd69ON7BOymMoGI8bWXk3iD38OZzPt+7o/Unaj0qBePfcVJvZmEvGAue2rd1wPFX343ad4rVNaBvrZ+48vsq1OvVx+6f0ubn90x1zu31J/DwUxjtrTJV1YyB+Gtex/n/yn/3gTp9D7kd8MAEAAACsRSDOWTUBeE3IC7AXH0wAAAAAaxGIc1Zf2r7MwHLxwQQAAACwFoE4d7LfjmKwPUey7znAlPhgAgAAAFiLQJw7GewffvjjzXBgvvhgAgAAAFiLQByAi4oPJgAAAIC1CMQBuKj4YAIAAABYi0AcgIuKDyYAAACAtQjEAbio+GACAAAAWItAHICLig8mAAAAgLUIxAG4qPhgAgAAAFjLIBD/P//d3wLAvYkPJgAAAIC1CMQBuKj4YAIAAABYi0AcgIuKDyYAAACAtQjEAbio+GACAAAAWItAHICLig8mAAAAgLUIxAG4qPhgAgAAAFiLQByAi4oPJgAAAIC1CMQBuKj4YAIAAABYi0AcgIuKDyYAAACAtQjEAbio+GACAAAAWEsbiO//IhAH4L7FBxMAAADAWgTiAFxUfDABAAAArOXqAvEf/vm/3n389NWgHK7Bx09vd09vbnaPXn4YnBvz+tnN7ubxq907/27wAMUHEwAAAMBarioQ/86/+t7u5ct/tPv6m98+ayj+7uWT3c3N893rM7Z5n7Y+/ofi45vnn9exLlg+BNCf6z59M15vLoE41yg+mAAAAADWclWB+Pd/9JPdP/7lX969ePHirKH41gPlrY//oWgD8Ymg++P7V7tHFfXuQiDONYoPJgAAAIC1XFUgvrdGKL71QHnr438ojoH4k92jxze7m2dvB+cbh/V+/OQQigvEYVp8MAEAAACs5eoC8b1zh+JbD5S3Pv6HognEX7y8/ef74XqeAutXh38KxGFafDABAAAArOUqA/G9c4biU4Hyx08fdi/2bw3fbpNxEN4gbgPJZB/qJuQ8Xb8PW/Pgs7sdR2yn5KzjD/3H8R3bm55P22foJyuvGV9tv23dO6xjG4gX2jzV2a/1sU4WiDf7i5/k92Y473LfU/PJAvHBOJI1hfsQH0wAAAAAa7naQHzvXKH4ZKD85nkvoMze4m3DxxgAN0FmLwA+Bbu9dm/rToXK0VnH3w3yb8P9buhbO5/S2LPymvHV9tutOzWW6BSIf5Wuabedpu/e2jTjSYPp/hvn555PNxBvz8cvZSbmD2uJDyYAAACAtVx1IL4PwP/Zr//GIRDfB+N//m/+alCnRhZ+Tolv5B5Dz2EbsV6jJuQ8lHdC2jiGxvnGH0LbZEzxurZu7XwK5VHsJx7P7rdiHbt1mnaHXwbcnk8C8eIYkzEV695xPv1AfDg2uKT4YAIAAABYy9UG4vswfP9WeBOG798Wj3Vq1QTKw+0tpgPb7E3n0rksgB0r71pr/LE8jrnffphPKcidKk/GF9se7bewXqXyXp2RkLk9vh13DJ3jOKLuPRqrG8+Vxh3L+/epWcvxLwDgvsQHEwAAAMBarjIQP2cYvjcVKB/fnu4HmGlYeoZAvBcId8RAtGut8cfyOOaueG4y+I5vS4+ML7Y92u+CdYyBeO+N8BBAzw3ET3uPrzOf7P4163ow8UY+rCk+mAAAAADWcnWB+LnD8L2xQDkGoY0YQMbjw7V3CD5jPzXWGn8sj2Pu9RPnkwTfWXnN+GLbo/0W2qsxCMQ7Yz2scWd95gbi535DPCrdv24bpfOwtvhgAgAAAFjLVQXia4The3MD5TYonQiUs3rtudsfrJwKkGusNf5Ynl3XthnmE6899X0MfMcC8dhPPB7rd8k6xkC8W/bocX9uMRDfy+Z7rBu+BFhhPqW+++3aQoXLiA8mAAAAgLXcBuJ/8vkvv34Qg4ot+aNv/fHZw/C90UA5BLh77VYUFYFyE3B2r+9ug9ELWW/r9sPhz/0n7XatOf5YvmQ+bbjbub52fEv6bftJ5teVhcbt+ML6ZoF46U3s43zC9Weez+CN+hCgx/sI9yk+mAAAAADWcgjE//zP/6dDGP6Nb/zzQVCxJf/2r/9m9/rrb84ahu8dA+XbELarCRjDPs77sDIGjPG4K15/rJdvm9EGpR1T22WsOf6sPLY3Np84tqdvhm88x/ay8WX1xvq9yzpmgfjeYQ4hYM4C8WN5J/TvjXPY9znnMwjEQ93SGOA+xAcTAAAAwFq+8Y1vXE8gfk1KgepWXWo+l+oXqBcfTAAAAABrEYg/UKW3kbfqUvO5VL9AvfhgAgAAAFiLQPzC9tttlLa/iOVbcKn5XKpfYLn4YAIAAABYi0D8wgb7RB9s943mS83nUv0Cy8UHEwAAAMBaBOIAXFR8MAEAAACsRSAOwEXFBxMAAADAWgTiAFxUfDABAAAArEUgDsBFxQcTAAAAwFoE4gBcVHwwAQAAAKxFIA7ARcUHEwAAAMBaBOIAXFR8MAEAAACsRSAOwEXFBxMAAADAWgTiAFxUfDABAAAArEUgDsBFxQcTAAAAwFoE4gBcVHwwAQAAAKzlEIj/+Mf/4yEMF4gDcN/igwkAAABgLQJxAC4qPpgAAAAA1iIQB+Ci4oMJAAAAYC0CcQAuKj6YAAAAANYiEAfgouKDCQAAAGAtAnEALio+mAAAAADWIhAH4KLigwkAAABgLQJxvkgfP73dPb252T16+WFwjtzrZze7m8evdu8+fTU4B0vEBxMAAADAWgTiFT6+eb67ubkZiGHqsd6T3Yv3eWD48f2r3aPP1z19czpf2/aUdy+fDNoYG8uXrjYQP67r893rJAT++OnD7sXj+wuJD4H04B535eM8l9pAvF2XhZ9pzuu3vvnt2WIba4kPJgAAAIC1CMQrZEF3E27fPHs7Wq/XTjEQn267pAl2szD09bPyWL50WwzEu7LP0tpqAvHmC564rvvyWLZ1zWfoPu/BEjHsrhHbWEt8MAEAAACsRSBeIQut945h6am8VK9tJwkxS9fEtjNtGF4RnNN3jkD8krLP0tqmAvH2C4Iv5PN4iXuwRAy7a8Q21hIfTAAAAABrefPmjUB8Sim0joFYqV6p/tg1Wd3ooYa1WyAQn286EP+yvqC5xD1YYh9w/+l3fzQoLxGIAwAAANdIIF6hGFrfbg+xSiAe2o7u+jbucB/qYdh7CoGb7Vhu3fbVbukSys91fboHdajThrOhrSzgHra3X+/zBOIxJJ41rrgOI2FzlH2Wopp7PadunGvm2M7w89xV+uxm5af1j/dwOPc5dRuz5n377+T+778yuO5mMJ+HphuI7/9Z8uOf/qytH9tYS3wwAQAAAKzlNhD/X3ff+MabgxhUUA6tY1haqte2k4SYpWti21HTVha0Ztq3d0OgmQWYpx/o7Myt6e9xmHMyjqXXx/2ms7e52yCzM5/sS4Q2dO7u9d4J6qfWb+o+xJB47ria/rMweEz2WWrPzbjXc+rGuWa6a1uqW5prVn76LOWf0e7859SdPe/wGTq0MXIPHqJuIB63Runq1oltrCU+mAAAAADWchuI//iwmfheDCpoAs0QJGYhZ/MG6YThNdNtR3PDuFKYWQ4hhyF9FhZmbS+9PhPrZG1lc4nXtXWTID5zt0B8fFzxuK2XfBZKxu5/HFN7TdLvOepmTuH08Jqs7VJ5FmY34njm1I3HY2M43tPhZ2DsHjxEMewuEYgDAAAA16wXiP/e7/3eIKjgFFD3DYPLqUAzC9Bq246ytkqyN6y7Yugbj0v1SuXxuFRvrHy4zclNVaDZLR+b99i5rmxspf6y46xe6d6VyjOlulPz6s5nTt39cWluY07B+OkznYXOpfI4hmHb05+7eO5c8y7dg4cqht0lAnEAAADgmgnEK0wF3bX1sgBt6pqSqVBvTt3jGKaDxdryeFyqVyo/vpGbbJEyN3gemffYua44tiiOIx5n9dptXApqAtbss3Qon5hX917Pqbs/Ls1tStyeJAu+j/WG5WPrH8/F41Ldc827dA8eqhh2lwjEAQAAgGsmEK9QG1pP1csCtKlrxpSCumgqAIxBYjwu1SuVx+NSvaw8W6O9ONd4nNUbm/fYua7SmLP+suOsXmmOc5TamJrXnGA4zr00txr9fofB915WHsdQajM7LtU917xL9+Ch6obdNQTiAAAAwDUSiFeoDa2n6mUB2tQ1Y5r2SsFeVzHUmxFC1pbH41K9rDxdo2aMc4Pn5Lq2zdutaqbWrjTmrL/sOKuXrflc2To1SmPI+j1H3RqHaydC5vZN8sFncfjvRza+OXWz/mfXHbkHD9E+4P7DP/nOIRSvIRAHAAAArpFAvEJtaD1VLwvQpq6Z0gS7WWD3+lln3+Zmm45QLwaVe6UQuLY8HpfqZeVZKHocY3/spZAylrfr02mvu2XJJQLx/XEzrn7w/3nuybWZ7LMUz8VxZPd6Tt04h+h474ZrlX35EOff2zN+EHIXxpJ+boflWd1zzHvqTfOHJm6NUiO2sZb4YAIAAABYi0C8Qm1oPVUvCzGnrqnRCxN7QgiY1UuCvlIIXFsej0v1SuXdwLoJUmMoGY8bWXls73i+Lsw8haz5usX+4vHouJqwviMLuDPZZ6l3vvJez6mbzaHfzu2XGQP55zuu7dM3w7ez289GvIdjn6OKusfxLp937x4ueOP/SxcfTAAAAABrEYgDD1b8smTMnLo8LPHBBAAAALAWgTjwYM0JuefU5WGJDyYAAACAtQjEgQdrTsg9py4PS3wwAQAAAKxFIA48WHNC7jl1eVjigwkAAABgLQJxAC4qPpgAAAAA1iIQB+Ci4oMJAAAAYC0CcQAuKj6YAAAAANYiEAfgouKDCQAAAGAtAnEALio+mAAAAADWIhAH4KLigwkAAABgLQJxAC4qPpgAAAAA1iIQB+Ci4oMJAAAAYC0CcQAuKj6YAAAAANYiEAfgouKDCQAAAGAtAnEALio+mAAAAADWIhAH4KLigwkAAABgLQJxAC4qPpgAAAAA1iIQB+Ci4oMJAAAAYC0CcQAuKj6YAAAAANYiEAfgouKDCQAAAGAtAnEALio+mAAAAADWIhAH4KLigwkAAABgLQLxB+L1s5vdzeNXu3efvhqcYx3WHB6G+GACAAAAWItAvMLHN893Nzc3A49efhjUvauHFs6W5nxz83z3+oGMcamaNf/4/tXu0WANzn//Kfv46cPuxePpe8V2xQcTAAAAwFoE4hWO4fCT3Yv3pzCuDUqfvR3UH/Px09vd08/XPX3TD/Zqwtn7lM15rtJcH4qaNT/e5+E6NHPbB+MPdX6XsuS+Z9cKxK9ffDABAAAArOUQiP/oRz8SiI8ohcPvXj5Jy8c0QXoMC2vC2ftUmvMcpbk+FDVrXgrEe22MnP8SLbnvS65lu+KDCQAAAGAtAvEKpXD4LuFd6ZqacPY+leY8R2muD0XNmk8F4u2b4jP/nwLXbMl9X3It2xUfTAAAAABrEYhXKIXDzT7b+/CuFK52t3v4lcPbxMFtkNpeH/esLgStxzeTu4Z7e5farNn7ujTnxvHt+Li1xSkcHo6vP5fB3txh7dqxN3uZ356vnVO77oX+e30sCMTbdkrr31uDYZ1DH4WxtuVh3Fn58X7s2z9t5dKd82C9k8/VoE7pnoys/XDOnTEU5llzbeleDa8ZrnHNuLms+GACAAAAWItAvEIpHD6FkF/1wvHeteGN13jcaIO9TujXtNkN7trQOQsrwxjH2oz9R6U5d8WQMh6X5tqUN/PKAt527FmIXTGnfVm2boPwNglZu2oC8e7noNtXbDu7R20I3f2yYH/9nQLxffudcTTr/DiML6x/Vpb1Ub32pftecU9K18Z7NWeNa8fN5cQHEwAAAMBaBOIVsnA4BmpZgLh3CCorQuIsyMvajMHgZN2KNjPN/AZicHs7lyw4zuZa6j+u8XHshbd9Yz+FNqO4dvE4k80rinvJl9rNxlmqW6pfKo9j6LVfKr/tN2vv0E96T6bXPrvvJXH+pWtjvXjc9p2Mp3bcXE58MAEAAACsRSBeIQ+HhyFj6U3hu7wBm5Vn7Y31X9NmbKMRw9CSQ73Hz3dPHw/Hlc01K8vKS2OcU96Gnt37VhGqDsc1vg69/6fAjHvU/UIh1jv0XQhts/J47+eUx7Vv+7njPYnX9dqcuCelay/17wH3Iz6YAAAAANYiEK9QHQ6HgPN4XT+MrAn8SuVTQWDsr6bN2Ea/rek5j7WXzbUpG37BcDQ3fC2VH47DWqV1kra6agLxu96jbH16dZPgu1QeQ+A55ee+J6V51dyT0WvvsMbx2lKbsQ3uV3wwAQAAAKxFIF7hruHw4e8xzKwI/ErlU0FgDD9r2oxtNGrn3NR79Hg4p2yuWVmmNMaa8lIf8dp4nJkKxJu+Tntv19+j0jjbtpPgu1Qe7/2c8qlxNErrFcuz9rKy2mtjvTlrHK8ttRnb4H7FB4WInp8AAFV9SURBVBMAAADAWgTiFWrD4V7dN3mQWhP4jZXH47bdJCQt1S2V99qrmHNvD/HKt+GzcWZKY6wpH+23Yi27xgLxrM2xduPc43Ema6v9QclzBeIV49jLxpKVp+uflSXrl9XL+ojHgzbP9O8B9yM+mAAAAADWIhCvUBMOt3W7eyQnYVvp7dZSOBfLm8Aw1j3UC8FnvHaqvKtmzod2RsLd0lyPbcdw9HPdisCzpjwLjI/r07+21FZXKRAv3Yexc9k9atZisG7Nuoa16n2+zhSIZ/2046hYr1ie3ffae5Jdm/YxY43jtVPl3L/4YAIAAABYi0C8Qk043HUMG4ehXr+9fqhZCuey8l4o2qi8dqy8qzfGYB+aHoPH/po0IWUvCE3mOijvtDs1xtryNjC9tR9TrBOPM7Gdk/HPQ+09Ota9DYsLa9F8nk7nhl8+xID7LuXnvCfZfY9rmd2T0rVpvco1zq4dK+f+xQcTAAAAwFoE4ivIwkYAcvHBBAAAALAWgfiZZVuHAFAWH0wAAAAAaxGIn5m3wwHmiQ8mAAAAgLUIxM/ktM+zMBxgjvhgAgAAAFiLQByAxb7zr75/Z/HBBAAAALCWNhDfh+ECcQDuIobcc8QHEwAAAMBaBOIALNaE2//bD35c7Q//h38pEAcAAADulUAcgMUE4gAAAMAWCMQBWEwgDgAAAGyBQByAxQTiAAAAwBYIxAFYTCAOAAAAbIFAHIDFBOIAAADAFgjEAVhMIA4AAABsgUAcgMUE4gAAAMAWCMQBWEwgDgAAAGyBQByAxQTiAAAAwBYIxAFYTCAOAAAAbIFAHIDFBOIAAADAFgjEAVhMIA4AAABsgUAcgMUE4gAAAMAWHALxP/uzPxOIA3BnAnEAAABgCwTiACwmEAcAAAC2QCD+QLx+drO7efxq9+7TV4NzbMPHT293T29udo9efhiceyh8zliLQBwAAADYAoF4hY9vnu9ubm4Gzhl8PrSg8uP7V7tHn+f49M3DGM8W1ATih/ucfJZOnu9er/gZeGifM+7Pb33z27PFNsYIxAEAAIAtEIhXOAbiT3Yv3p9CxCYwvnn2dlB/TBOaxqD5oQWVSwLx0hwfkjXGWBOI9+ovWOO7emifM+5PDLtrxDbGCMQBAACALRCIV8gC8b13L5+k5WNKIehDCypL46yx5Nr7ssYYBeI8ZDHsrhHbGCMQBwAAALZAIF6hFIjfJdAsXfPQgsrSOGssufa+rDFGgTgP2T7g/tPv/mhQXiIQBwAAAK6RQLxCMRC/3Vt8H2iWgsaPnz7sXjw+nvuVbP/o2y1X2uubrVjC+Wi4F/Vw7+lSmzWBbRbW1rQ3HFd/Du1WM410zY7B8qmN/doPw+Z2PM0e77dttWteGMN5xhj7yMc4JlvjaDjW4X2eUzf7nA6uK3zm2LZuIL7/Z8mPf/qztn5sY4xAHAAAANgCgXiFUiB+3DLlGDp2w/HetSH0jMeNNpTshJVNm92AtQ2L01CzP8axNmP/UTbO2vaya7vlzXzaUDkLo7tlnYB8EIiHus2YsjXrld3TGMeUxtBrr+I+z6nbDcS7X9a093PflkD8KnUD8bg1Sle3TmxjjEAcAAAA2AKBeIUsEI9BcBac7h1C827gWAhBs/AyazN7w3e0bkWbmWycte1l12b1DuVhbYvzC0H1aTzDt6Azsd37GuOYbAyNYh/JGO9ad40fFuXhimF3iUAcAAAAuGYC8QpN+N03/sb44boZbyaXQs0swCwFrrH/mjZjG41snKXrYnl2bVYWy8fml52L/fbrxy1NLjPGMcX+Jtrp/T8TZtTdH/c/T80aDT/LXJ8YdpcIxAEAAIBrJhCvEN8QLolv3B6v67/BXApBS+HunEA89lfTZmyjbSsZZ+m6WJ5d25QNv1g4ukvYHPvtlU/Uva8xjsnGUNNO9z7Pqbs/juvQljXznPh/DrBdMewuEYgDAAAA10wgXqE2EN/rBo6Hv8ftNwohaBZUxvKp8HPsbeBSm7GNRjbO0nWxPLs2K4vG5pedi/2O9RPrZvWysigbR825TKm/qXbO9YZ4rNt+IVA4z7Z1w+4aAnEAAADgGgnEK8wJxNu6b/bh4vCaUghaCipjeTxu253YL3qszUw2ztJ1sTy7NhtflP3IY3vudtuauwTiWbuj9c44xjHZGBrZ3A7XJGM8R932mhmfdbZlH3D/4Z985xCK1xCIAwAAANdIIF5hTkjY27s6CR5Lb/SWgspYXnqL91AvbM8Sr50q78rC2tJ1sbw0x/hDpG3d7rXNfu3Jj3TGsDn22+17EAKHNbuvMY7J1jiei/PL7vOcut01O8wrhP/ZmnId4tYoNWIbYwTiAAAAwBYIxCvMCcT3jttUlIPRNlDthKqlIDIrn/rByLFrx8q7srC2dF1Wns1xUH4rBsLdcPk0t2GAnfWbXb+/Jqt7H2Mck61x73zlfZ5TdxCIh3lm10ANgTgAAACwBb1A/Hd/93cHIQfzxX2bWa4Jb0vhMXBZAnEAAABgC37zN39TIH5O2b7NLDf3LX3gfgnEAQAAgC0QiJ+Zt8OX2a9f3HJk7o9VAvdPIA4AAABsgUD8TJp9w4Xhywz25j7wZjg8dAJxAAAAYAsE4gAsJhAHAAAAtkAgDsBiAnEAAABgCwTiACwmEAcAAAC2QCAOwGICcQAAAGALBOIALCYQBwAAALZAIA7AYgJxAAAAYAsE4gAsJhAHAAAAtkAgDsBiAnEAAABgCwTiACwmEAcAAAC2QCAOwGICcQAAAGALBOIALCYQBwAAALZAIA7AYgJxAAAAYAsE4gAsJhAHAAAAtkAgDsBiAnEAAABgCwTiACwmEAcAAAC2QCAOwGICcQAAAGALBOIALCYQBwAAALZAIA7AYgJxAAAAYAsE4g/E62c3u5vHr3bvPn01OMd5HNb4Zu/57rV1hrMSiAMAAABbIBCv8PHN89sgte/Ryw+Dunf1EAPxj58+7F48vvu82+vvcV6lPt+9fNILwkv14Fr91je/PVtsY4xAHAAAANgCgXiFYyD+ZPfi/Sk4/fj+1e7RPiB+9nZQf8zHT293Tz9f9/RNP4R9aIF48yVADL/35bGsZO3QOVvLrM+2rHOvsnpwzWLYXSO2MUYgDgAAAGyBQLxCFojvHd86HpaPaYL0hxyIZwHyQ1Ray6iZT22QD9coht01YhtjBOIAAADAFgjEK5QC8dpAtuaahxWIH9+8FojD9dgH3H/63R8NyksE4gAAAMA1EohXKAbit9uK7APZUqDd3ZrjV9ofdey4DZ3b65utWML56PQDkY3hD0WW2qwJho/tD+ecSfcaj/PqjK3dbqYRzteMezj/vM90//ekXs1cYMu6gfj+nyU//unP2vqxjTECcQAAAGALBOIVSoF494cau+F479rwFnM8brQBb3fv62Qf7/bt7SxEDmMcazP2H7X9JH316iV7qR+uLYTOTf1mTtn2LLXjHl3L7rWFN8QH9SbmAlvWDcTj1ihd3TqxjTECcQAAAGALBOIVskA8BrRZsLt3CM2T0DUNcWMfSZsxxJ2sW9HmmGPoPwyoe30k5dn5Ut9xfWvHPbqWdwjE4zFckxh2lwjEAQAAgGsmEK+Qbrsx8cb44brbt6x7b3hXhrhZedbeWP81bcY2Sk7B+GnezXjiXLp64y/MPZaXxhfL43XFehWBeM1cYMti2F0iEAcAAACu2SEQ/+EPf3gIxN++rXtr+EsT32AuiaHq8br+3t61IW5WPhWIx/5q2oxtjInbtZTm0pUF4sMvF44uGogX2oJrEcPuEoE4AAAAcM2+/vWvC8Sn1Abie92Q9fD3uD1IIXiNIW5WPhWIr/mGeNZHaS5ddwmdS+OL5aX2BvUE4tALu2sIxAEAAIBrJBCvMCcQb+u+2Qesw2tKwWsMcUvl8bhtN9lju1S3VF7jcG0TiCd9Rv1Af7p+vGasvHYtqwLxyrHBVu0D7j/8k+8cQvEaAnEAAADgGgnEK8wKxJtgdb8NSBLqlt7yjiFuqbzddiTU7QbVpWunyhvHMfbbOpTf7qXe2xO92V+9+2OX++tvj2Nf8cdI2/oVoX8sr13LmkC8O7bSXGDL4tYoNWIbYwTiAAAAwBYIxCvMCcT3mh+gjAFsv719gH0KX2M428jKe6F7o/LasfJT+7d7hQ/ka5DVH9sPPPuR0m5Anl1TKq9Zy9pA/Fi3PBegTCAOAAAAbIFAfAVxL2+AaycQBwAAALZAIH5m9qIGvkQCcQAAAGALBOJn5u1w4EskEAcAAAC2QCB+Js2+4cJw4EskEAcAAAC2QCAOwGICcQAAAGALBOIALCYQBwAAALZAIA7AYgJxAAAAYAsE4gAsJhAHAAAAtkAgDsBiAnEAAABgCwTiACwmEAcAAAC2QCAOwGICcQAAAGAL2kD8d3/3dwXiANyJQBwAAADYAoE4AIsJxAEAAIAtEIgDsJhAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2AKBOACLCcQBAACALRCIA7CYQBwAAADYAoE4AIsJxAEAAIAtEIgDsJhAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2AKBOGzE62c3u5vHr3bvPn01OPcQPPTxsS6BOAAAALAFAvEKH988393c3Ax9oeHfx08fdi8eD9fj0csPs+sd1/bJ7sX7fB0/vn+1e/T5mqdv8vP9doZ93dw8372+kns0FTgfzg/mf39rMTU+rptAHAAAANgCgXiFLLQ9hb3rhoxLffz0dve0IlCu1QTPg/D7c/kw6K6td65AvNxOjXOv1bnNCZxr1+2c5oyP6yMQBwAAALZAIF6hFLZeInSc65xjbL8EeDb+Oamtd6hbWNv2fOX4p9qpUdvXpcwJnC8xlznj4/oIxAEAAIAtOATiP/jBDwTiI0phaxM6xregH5JzBqPNG9RTQXdtvUPdwtq25yvHP9VOjdq+LmVO4HyJucwZH9dHIA4AAABsgUC8QilsLZbfhpHt3s0hJHz38sntViu3wXHjNkAeXF8Ilod7Rve3bxme77c16KcizDy2OZxzVFuvtIbt+cpgd6qd45r32+kG90vXqg2Db7eKac635eH6+CVKut96uO9zAueadRvOubz9T03dbHyD6wqfZbZPIA4AAABsgUC8Qha2tgFpCPjiW+PZ9iFNONsNFdvrHjdheSjv7rvdBLlp+JiPMwajsd1snJm276T/O9VL1rZ3vjD+aKqdvRjYxuNSXzVr1Qa/WYgd1uA41hDOvwl7q9+uX7csjndMaS7dtmNb6ednRt3u+No16s5739bE54vtEogDAAAAWyAQr9AEmFNvyGZB6en6U3h4DMSH4W0WMrblI0HuWP9ZMJrVO5RXhMqNU6ifj6W2Xr62Q1mwW9VOdy06P5p5XJfpLw9q1+p474afieyeltqM4n2Ox2OyuZTaba9JxnXXug/9B0o5P4E4AAAAsAUC8Qox/CztkV0KIWP5acuUfr2a8uzN4VLdrO9S2Vj5mFPgPR6kl+rFtY1qxzTVTq/e4+e7p4+Ha5j1lZVl5aXgeE55um3KmQPxOZ+fOXX3x+kb4hX3hOsgEAcAAAC2QCBeIQtb020vbkPIwVvKt+4jED+Oqy4Qj+OL46xV2lYjyupla9u7Jhl/ZqqdrlKwnPVVu1alNmvLj2+Sj2+REo/HZHM5lM/4/Mypuz/OxtfM62DijXi2TSAOAAAAbIFAvEIpbD2GfePhc6Ym+C6VT4WUsY1sTFnZUrHfklivtLaN2rFOtRPrPXo8bDPrKyvLZGFwbXmpj3htPB5TanPO52dO3f3x2PjaLxYK59k+gTgAAACwBQLxCqWwtQn5xn5sMRODxLnlpeAx6z8LRrN6S8UvB0pivdLaNrLxZ6baOdTp7iEe3m4u9VW7VqV7UlM+2u+ZA/GxdrK5nqNue03FPWK7BOIAAADAFgjEK4wFeXnAG8PNt7unnaAwBtyN2vLS27ZxLG3fyVu+NeOMjm0Nx9e0dfpioK7eqSxf28P5kWB32Ha5nb3D+twGuFmgu2StSmFwTXm7lUwMl8M9LrWVGVu3WZ+fGXUHcwpfIswZP9sjEAcAAAC2QCBeYSxszQLDJkDN9preiwH3XcqnfoCxN8bueLoB8MQ4oza4HQj7q1fWO41hWN6eHwl2h+3E/o721x4D3DDO8Ib/oJ0Za1UKe2vL28/Rrf2YYp14PGZq3WZ9firrDgLxsF7ZNVwPgTgAAACwBQJxABYTiAMAAABbIBAHYDGBOAAAALAFAnEAFhOIAwAAAFsgEAdgMYE4AAAAsAUCcQAWE4gDAAAAWyAQB2AxgTgAAACwBW0gvg/DBeIA3IVAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2AKBOACLCcQBAACALRCIA7CYQBwAAADYAoE4AIsJxAEAAIAtEIgDsJhAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2AKBOACLCcQBAACALRCIA7CYQBwAAADYAoE4AIsJxAEAAIAtEIgDsJhAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2IJDIP7973//EIb/zu/8ziDkAIApAnEAAABgC772ta8JxAFYRiAOAAAAbIFAvMLHN893Nzc3Q49f7d59+mpQH+BLIxAHAAAAtkAgXuEYiD/ZvXh/Cr8/fvqwe/F4H4w/370WigNfOIE4AAAAsAUC8QpZIH4of/9q9+jmZvf0jUAc+LIJxAEAAIAtEIhXmArEH738MLgG4EsiEAcAAAC2QCBeoRiIF8pfPwt7jT97eypP9h1vt1+5PdfWuw3cm3ay4P20dcuwP4D7IhAHAAAAtkAgXiELvpu3w7vhcwy2j2Vvd09v6zQ/zhm3WIlbr7SBered5Np8DKf+AO6LQBwAAADYgn0GLhCf0ITRfcMf0zyE0UngfTp/G5iHwPrdyye98PsYiBd+xLNzbemNc4D7JhAHAAAAtkAgXiG+Id4E3zHYPm1fMtxGpXEIvzthetNWdzuUUtDdLZ8K3wHuk0AcAAAA2AKBeIUYiJ/K8kC6t4f4IDTvB9nHdvpvm1cF4mGbFYBLEogDAAAAWyAQr5AF4nvH4Hu4dUp7XbPHdwi3u8H24e8hNBeIA1sjEAcAAAC2QCBeoRSIN6F0d7uTKLu2LXuzv37YblUgnuwpDnApAnEAAABgCwTiFbJQu9F9S/ywHUrF296nvcaH50rXZOXtj312+szGALA2gTgAAACwBQLxCmOBeHdblP/5579z/LHNriTY3jv+uGb+dnkMvsfK2x/47LCNCnDfBOIAAADAFgjEL+QYiJf3HwfYEoE4AAAAsAUC8Quw/zdwbQTiAAAAwBYIxC/A2+HAtRGIAwAAAFsgEL9Hzb7hwnDg2gjEAQAAgC0QiAOwmEAcAAAA2AKBOACLCcQBAACALRCIA7CYQBwAAADYAoE4AIsJxAEAAIAt+NrXviYQB2AZgTgAAACwBd4QB2AxgTgAAACwBQJxABYTiAMAAABbIBAHYDGBOAAAALAFAnEAFhOIAwAAAFsgEAdgMYE4AAAAsAUCcQAWE4gDAAAAWyAQB2AxgTgAAACwBQJxABYTiAMAAABbIBAHYDGBOAAAALAFAnEAFhOIAwAAAFsgEAdgMYE4AAAAsAUCcQAWE4gDAAAAWyAQB2AxgTgAAACwBQJxHpzXz252Nzd7z3evP301OA88PAJxAAAAYAsE4pU+fvqwe/G4CWpPHr38MKi7Re9ePhnM7ebmye7F+3UC6XY9H7/aveuE3sdxnILwUj3gYRGIAwAAAFsgEK/w8c3zNPzel8eyrfn46e3uaeFt7NfPzhOIN308fXNqKwu627Jnb0frnUM2JuDuBOIAAADAFgjEJ2Qh7bVow/CV5/bx/avdo4rwuVnr+/iSoXZMQB2BOAAAALAFAvEJ9xUaX0LcnmQtteGzQBy2SyAOAAAAbIFAvMLxRx7rtg9pgtZ2H+6w1cehrX3Z7TYs+7//SlMWgulsu5C7tB/b7bU9I+i/S9+HuXWv2bvts63/uY1mW5qpeoPxJ/XHzrXtFfqqmWfaxox1hGskEAcAAAC2QCBe4bTPdh6OtvVug9TmDecsdG6D1G4AexsGx7eV41vMd20/E9uaEuvP6TvOo1e/G/YX3hAf1GsC6+4a7u9RE4iHvd2b+9crK4xpap7plxSdvuFLJRAHAAAAtkAgPsNxi5Hb0Lf0xnIMgw9h9+nt8mNo3N+mpHTtob/mDepCnZr2M6VAOLO071Jfg6C7MhCPxzXiNdmYaubpxzghJxAHAAAAtkAgfgenYPwUBmcBa1Yeg9l+m6cwOb7VHNuZ234UrxtTqhvLS33Heo1YvyYQrw2k021TpgLxpCyWn9qt20IHvhQCcQAAAGALBOJ31G6j0gS1t6FpL4DtmBsaH99K7gTkC9uPYuA+ZmnfcW6NWL8qEC+0Nagf5jboK2mndp7dPg5slwICcQAAAGATDoH49773PYH4HXTf6s4C1kwMZkvnDn/v7pF9hvaj2rpL+y5dH+ufIxAvnR/0ldTLyqa0IXoyb/iSCMQBAACALRCIL3B8S/g2EC/sPx3FYLar3av6zT5k7W/JcY72oybMjQF0tLTvUtAc61cF4hNjyfpqr5kKxCfaLol7qcOXSCAOAAAAbIFAfMJxa5HkhyIPIWg/vG3K+iHr5+s7QWwMgft93QbCj08/ppn1edf2M02b2TWvn3X2SF/Qd2l7lli/JhDvjqX3Bv2+j8/H7VY2nXPHLy5iX/mYpubZ9DM2PvgSCcQBAACALRCIT2gD1oH8jeA2rO0Y7D09Ep42P9gZ36Y+V/uZ9AcoD/pfBCzpu3ftbaAc69cG4se6w/vSjCXuBb5vL20jGdOgPLad9BvbhS+RQBwAAADYAoE4AIsJxAEAAIAtEIgDsJhAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2AKBOACLCcQBAACALRCIA7CYQBwAAADYAoE4AIsJxAEAAIAtEIgDsJhAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2AKBOACLCcQBAACALWgD8f1fBOIA3IVAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2AKBOACLCcQBAACALRCIA7CYQBwAAADYAoE4AIsJxAEAAIAtEIgDsJhAHAAAANgCgTgAiwnEAQAAgC0QiAOwmEAcAAAA2AKBOACLCcQBAACALRCIA7CYQBwAAADYAoH4Gb1+drO7efxq9+7TV4NzD8HHT293T29udo9efhicW9sl+wbWJxAHAAAAtkAgXunjpw+7F49vdjc3fd2A91oC8Y/vX+0efa739M355lHbN7BNAnEAAABgCwTiFT6+eT4Iv5tygXid2r6BbRKIAwAAAFsgEJ/Qvhn+7O3gXCQQL6vtG9gmgTgAAACwBQLxCU2QKxBfprZvYJsE4gAAAMAWHALx7373uwLxEYeg++bJ7sX78YC4DcRvA+V2r/EQpqf7kYc6bVu327V0g/YmsG6vTUL4YR/78deF0lkgXppb1tacvsfm8u7lk0NZdxzZFxRjbfTG361T8QUHUE8gDgAAAGyBQLxCG8IWwtZGG7p2w+tk//G493j29nTbVgzTb8Pfpm62pUsbEHfLOnOIoXRUDMQLc+sF1jP6rplLfOs+Hk+10R53r9mPRyAOZyUQBwAAALZAID5D88ZyDIYb2ZvkMaAtiUHvsa3nu9edPkptHYPpU7+xrbZeCI9LyoH49Nxq+86uPZSHuTRh+n4sxza656bb6F7frQOcl0AcAAAA2AKB+B2cgvF+QFwKg7Py4bYi/TrpNUlQHcuzt81PfZbPldpryrLxxPKx9uO5rI9S+SHgfvx89/Rx/ob5WBundZ7e8ga4O4E4AAAAsAUC8TtqtwGZCLGz8mb7kcEWKbFOIRDvhegdWwzE4xy6cyn1E8cZr83aaNb8YOJtfWA+gTgAAACwBQLxBY5vip+2NclC21iehc2xTna8V7q2KwbPted69ZJ+svHE8rH247msj5JmC5RHj8Ob4zPaiNdkcwHuTiAOAAAAbIFAfIHjW8fLA/Hshx+ztkp7ZndlbbXnkh/4zGRjzMYTy+f0XTOXY73OHuKHNk7rXdtGFPcpB5YTiAMAAABbIBCfcAxk+z9ueShPwuW60Ph2q5X4Q5ThreVSW02//UD9c5uduk2dbh/d7UXWCsTn9l0zl0P7t21lAfhUG4e/h8A8jhlYTiAOAAAAbIFAfEIbYA8M3zAuBa2xPO59vQ+JY5143BtTEzp3xG1DYh/HtspbmmTX3iUQn9v32FyOXxT017lpOwvWszbS+5fMA1hGIA4AAABsgUAcgMUE4gAAAMAWCMQBWEwgDgAAAGyBQByAxQTiAAAAwBYIxAFYTCAOAAAAbIFAHIDFBOIAAADAFgjEAVhMIA4AAABsgUAcgMUE4gAAAMAWCMQBWEwgDgAAAGyBQByAxQTiAAAAwBYIxAFYTCAOAAAAbIFAHIDFBOIAAADAFgjEAVhMIA4AAABsgUAcgMUE4gAAAMAWCMQBWEwgDgAAAGyBQByAxQTiAAAAwBYIxAFYTCAOAAAAbIFAHIDFBOIAAADAFgjEAVhMIA4AAABsgUAcgMUE4gAAAMAWCMQBWEwgDgAAAGyBQByAxQTiAAAAwBYIxAFYTCAOAAAAbEEvEP/t3/7tQcgB9+Hdyye7m8evdu8+fTU4Bzx8AnEAAABgCwTilT5++rB78fhmd3PT9+jlh0Hda/H62XC+fc93r88UYAvEYV2/9c1vzxbbGCMQBwAAAP7/9u79WY6rMPD4/aMkJexms69sahMgm/ysKpV+oirZxEA2BEhSWW1pV4kR8S8pQniIUFgQWZIxS7AhS4gLI+thRUayiR/Yxi9dg68fwpVAyjF2r07P7Z6e06dneqbv1Z0z8+mqT1m3u6ene851gK9OzuRAEO9h89ThZPwO+5v7NrfOFgdvnnfw1M5F3d245iI2Lx0r9u3ifQjisLvi2N1HfI1pBHEAAAAgB4L4DPXM8ENnW8diuxGNd+Oai9jt+xDEYXfFsbuP+BrTCOIAAABADr74xS8K4tNUM7QF8d29D0EcdlcI3BeuPtba30UQBwAAAFaRIN7DaC3tA8WRS92xNrne9nZET64/HgX28vUhCG8vzxL+fLzjml2z1lP7y9BcrvXdvod54va0IN7n+YLWZxTfZxTEq/Oby9JMuwbQrRnEwz+7PP6D6/X58TWmEcQBAACAHAjiPdSzxIMps5i7onHXWuPJ0BtH7sQ1U+G7a/8oiIdrTwb9an98r11S91Efm/F89X01PrvynPg+G8fjv4Tocw2gWzOIx0ujNDXPia8xjSAOAAAA5EAQn8M4LqfD+LRoHKtnhE8E4DCTe/Y1U+G7a/+08B3fwzSp+5imee0+XwzaDOKje54M+H2uAXSLY3cXQRwAAABYZYL4ArpmXU+LxsllReIgnojTqWumwnfX/vGSKe17mnYslrqPieNTnm98rHvZmSqIn+wI+H2uAXSLY3cXQRwAAABYZYL4guplVJpLeHRE4861sFckiPd5vuZ5pejeJ2bfT1kGZdo1gG5x7O4iiAMAAACrTBAfIA7KqWic2hfEwTj+edrrU+G7a398j03TjsVS9zFtf9fzNF/TPF4vmbL9paLNuJ6SugbQrRm7+xDEAQAAgFUkiA8Qr/udisPJfYkviOwKyKnXd51fz1pvBfH2MiOpeD5N132k9qeeLxa+iLN5X801xEfHekTx6BpAtxC4v/HAQ2UU70MQBwAAAFaRID7DKDK3Z1Gnom0VpFP7muG5XvajTxBPXLP5/lWInljDuxXEw/7JZ4hj/iyp8D1639nPV54Thff4eZtBvP658dx9rgF0i5dG6SO+xjSCOAAAAJADQXyGOvi2pGcmV6G6Gabr5T22hcgbx9z451nXDCbW3d4Isbo967teFiW6h3lieHkPHUG8eazr+ZKfYfSscRCv922f+52Xz8y8BrB3BHEAAAAgB4L4iptnnXCARQniAAAAQA4mgngQRw7yJogDt4IgDgAAAORAEF9xgjhwKwjiAAAAQA4E8RUniAO3giAOAAAA5EAQB2AwQRwAAADIgSAOwGCCOAAAAJADQRyAwQRxAAAAIAeCOACDCeIAAABADgRxAAYTxAEAAIAcCOIADCaIAwAAADkQxAEYTBAHAAAAciCIAzCYIA4AAADkQBAHYDBBHAAAAMiBIA7AYII4AAAAkANBHIDBBHEAAAAgB4I4AIMJ4gAAAEAOBHEABhPEAQAAgBxMBPHTp0+3IgcAzCKIAwAAADk4efKkIA7AMII4AAAAkANBHIDBBHEAAAAgB4I4AIMJ4gAAAEAOBHEABhPEAQAAgBysXBD/3hNPF5tbN1r7c3Du6IFiY/+x4lym9w+sL0EcAAAAyMFKBfGHHr5WHD36v4svnTq9Y1H85KGNYmNjmsPFyR16L0Ec2C133futucXXmEYQBwAAAHKwUkH8kce+X/zJn/5pceTIkR2N4pXNS8eKfRsbxcFTO3vdiiAO7JY4dvcRX2MaQRwAAADIwUoF8WA3o7ggDuQqjt19xNeYRhAHAAAAcrByQTzYrSguiAO5CoH7wtXHWvu7COIAAADAKlrJIB7sRhSfFsQ3t64UR/ZH64sfOts6r7UmeeOcVBCvzt939EprX+oaACnNIB7+2eXxH1yvz4+vMY0gDgAAAORgZYN4sNNRfGoQP3V4Ilpvbp0tDjZCdh3MG8G7PGdKEB+F7wPFkUvV+bOvAZDSDOLx0ihNzXPia0wjiAMAAAA5WOkgHgL4579wZxnEQxh/4pnnW+fMY1oQTymD9na8rgL5tNc2g3j550YMD/pcAyAljt1dBHEAAABgla1sEA8xPMwKr2J4mC0enzOvWUE8uWxKHcSrY5ORu6kK4ifLGN5+nz7XAEiJY3cXQRwAAABYZSsZxHcjhgfTgnjnWt8da4Kn1v4ezQpPH0u916zzACpx7O4iiAMAAACrbOWC+G7F8KAriHftTwXx+DXN4/WSKacOt+J6SuoaACnN2N2HIA4AAACsojKIf/e7312JIL6bMTzoCt+p/akvwIyFL+JsLn/SXEN8dKxHFI+uAZASAvc3HniojOJ9COIAAADAKlqpIP63f3f/rsXwIBW+y/3bX3bZXL6kXtak+aWa0fIm8QzyZhCvf25E8T7XAEiJl0bpI77GNII4AAAAkIOVCuIv/ujV4uSXTu1KDA+6gnjzWLW2d4jYzVhdR/OmKGTHQbzet33ud14+M/MaAHtBEAcAAABysFJBHIC9IYgDAAAAORDEARhMEAcAAAByIIgDMJggDgAAAORAEAdgMEEcAAAAyIEgDsBggjgAAACQA0EcgMEEcQAAACAHgjgAgwniAAAAQA4EcQAGE8QBAACAHAjiAAwmiAMAAAA5EMQBGEwQBwAAAHIgiAMwmCAOAAAA5EAQB2AwQRwAAADIgSAOwGCCOAAAAJADQRyAwQRxAAAAIAeCOACDCeIAAABADgRxAAYTxAEAAIAcCOIADCaIAwAAADkQxAEYTBAHAAAAciCIAzCYIA4AAADkQBAHYDBBHAAAAMiBIA7AYII4AAAAkANBHIDBBHEAAAAgB4L4ijh5aKPY2AgOFye3brSOA+wmQRwAAADIgSA+wzg0d9n7AH3u6IGluA9ged1177fmFl9jGkEcAAAAyIEgPofNS8eKfRsbxcFTyxOeN7euFEf2bxQbh862jgFU4tjdR3yNaQRxAAAAIAeC+ByWOYjvO3qldQygEsfuPuJrTCOIAwAAADkQxOcgiAO5CoH7wtXHWvu7COIAAADAKhLE5zAriFfH6/XF9x8rzjXW9S7XIw/7Th2eON61v14OpXnNxtIom9X5Hcfr95w4p73WeNf7j9cmP1scTLxH63kt2wJLqxnEwz+7PP6D6/X58TWmEcQBAACAHEwE8bvuuqsVORibFsSrY9VM7dTa3nWc7orW0f4QvJszvze3w/TkvvQM8ercZJTfOFAcuRTva7//KIiHY+OIXj/n/skv8oyfH1guzSAeL43S1DwnvsY0gjgAAACQgzvvvFMQ76sriKfid7m/nHE9js+j8NwxQzuxP6WezV2F6I4gHp9XSd1r1/uPgvhkPB+f37E/8Z7A3otjdxdBHAAAAFhlgvgcOoN4z/1dwbhrf3mN1LIpM4J4aiZ503gplOn3FZ+36H5g78Wxu4sgDgAAAKwyQXwOceCO90+u1T22aBCvljJphu343EWC+GjmuiAO6ySO3V0EcQAAAGCVCeJzmBXE4/2xrvCc2t91zfjcRYJ4HK7ja3adt+h+YO81Y3cfgjgAAACwigTxOXRF6tS63Cld4Tm1P/Ve9fvMCOJd15y4RryGeOLcrsA9735g74XA/Y0HHiqjeB+COAAAALCKBPE5pCJ1faxchiQO2GeLg43Q3BWeU/urWd6tcB329Qji9TIu0XVH15iM1qn3D7oC97z7gb0XL43SR3yNaQRxAAAAIAeC+BymBfHy+HYUT60fHnSF56798drkIXrH53YF8eaxiXtKvE98zUpX4J53P7D6BHEAAAAgB4I4AIMJ4gAAAEAOBHEABhPEAQAAgBwI4gAMJogDAAAAORDEARhMEAcAAAByIIgDMJggDgAAAORAEAdgMEEcAAAAyIEgDsBggjgAAACQgzqInz59WhAHYCGCOAAAAJCDkydPCuIADCOIAwAAADkQxAEYTBAHAAAAciCIAzCYIA4AAADkQBAHYDBBHAAAAMiBIA7AYII4AAAAkANBHIDBBHEAAAAgB4I4AIMJ4gAAAEAOBHEABhPEAQAAgBwI4gAMJogDAAAAORDEARhMEAcAAAByIIgDMJggDgAAAORAEAdgMEEcAAAAyIEgDsBggjgAAACQA0EcgMEEcQAAACAHgvgSOXf0QLGxcbg4uXWjdQxgmQniAAAAQA7qIH7mzBlBPOHkoY3OSL156Vixb2Oj2Hf0SvvY1tni4M1jG4fOto51GRrEq/s5eGqx1wOr6657vzW3+BrTCOIAAABADgTxGTZPHS42OiLzKGBvFBv7jxXnooi9SJwWxMeqv1BYhWeBZRDH7j7ia0wjiAMAAAA5EMRnqMJsahZ4mD2+b386Yo/i9oHiyKX+QVcQH1ulZ4FlEMfuPuJrTCOIAwAAADkQxHsol02JZoHXM5iPpsNt6jWzCOJjq/QssAxC4L5w9bHW/i6COAAAALCKBPEeUrO9R0uphHh9pTiyf3Kt8K5Z5VXkLZdZSSy1Mg7i29esz+030zwVkeswH713fG/1uc37azxT972lo/WsZy3PSVwrvGfrPqJ7Sd5r4i8S6mffXvYmdQ+wLppBPPyzy+M/uF6fH19jGkEcAAAAyIEg3sPU0Lx1ozUbPHV+/AWcdQxuRecQdycDeLU/FZ6bUu9bh+Pm/UXrotf30jwnRP0F763Ps9bBPP6LhO2fU89Sn5OI26PnnLy3+tnn+GJTWFXNIB4vjdLUPCe+xjSCOAAAAJADQbyHOOhWP9fBtwzM4xgbL30Sv76+bvJ17QgcxNE9JRWRU6E4vp8+X2DZ997ia9fvGT3rrOdJPcu016Xed/Ts7ZnjsI7i2N1FEAcAAABWmSDeUzOujmLtOO42g3IqzHbF3Xh/HNKbph3rul7QFZCTEXvK0izT3r95LHUPQXN/nwCfuk7XUjSp+wg/dz07rKM4dncRxAEAAIBVJoj31JzhHIfXZgRPRdt6eZAOex3EJ/ZV9xXN8J72/qkgHj9j81lT9xlLnZP6bCdeU6/rLohDLI7dXQRxAAAAYJUJ4j01Y2wZWruCcbQ0SPnaRNxN6Rud42OV1Pt0ReGu/c3rNI9Pe/9UEJ/2rIueMyuIx/c47Rlh3TRjdx+COAAAALCKBPE5jEL44eRyH6OAe6A4eOhAK8KmllFJGQXd9rIlfV+fishdUbhrf32t5Prms+8t/jml1zmJZwm67jt1za5zYR2FwP2NBx4qo3gfgjgAAACwigTxOYyi8EZHGB7NXk4tN1IeLwNzYsZzaxZ2uMbkTOzRUibp2dkT75GIyF1RuLm/vI/onuPXzXNvfZ61OmdirfXGfXTNBk/NXu+6j/gZYJ3FS6P0EV9jGkEcAAAAyIEgPoeuGFsZRdn2rOb69VUEbmieWy/50VqHe3YML68/JIhH9xW/Zt57m/Ws5TmJ952I6M1rTITz6ktAG2Y8Y3x/wM4SxAEAAIAcCOL0Eq/PDdAkiAMAAAA5EMTpRRAHphHEAQAAgBwI4vQiiAPTCOIAAABADu68805BnNkEcWAaQRwAAADIgSAOwGCCOAAAAJADQRyAwQRxAAAAIAeCOACDCeIAAABADgRxAAYTxAEAAIAcCOIADCaIAwAAADkQxAEYTBAHAAAAciCIAzCYIA4AAADkQBAHYDBBHAAAAMiBIA7AYII4AAAAkANBHIDBBHEAAAAgB4I4AIMJ4gAAAEAOBHEABhPEAQAAgBwI4gAMJogDAAAAORDEARhMEAcAAAByUAfx06dPC+IALEQQBwAAAHIgiAMwmCAOAAAA5EAQB2AwQRwAAADIgSAOwGCCOAAAAJADQXyJnDt6oNjYOFyc3LrROgawzARxAAAAIAeC+AwnD210RurNS8eKfRsbxb6jV9rHts4WB28e2zh0tnWsy04E8c2tK8WR/eGeJ6XucTfU77//WHFuwHMAeRHEAQAAgBwI4jNsnjpcBuWDp9pxdxSw0/G3iuWp13UZGsSre43jd9gf79stgjisJ0EcAAAAyIEgPkM10zsVlMPs8X370xF7FLcPFEcu9Y/CQ4J4HaLnmJEOsFMEcQAAACAHgngP5bIp0YznKpQfPJqeCZ56zSzDgvj8S7QA7BRBHAAAAMiBIN5Darb3aHmSEK/bM7O7ZpVXy6jUa3tHwXwcxON1wPvNNB+td97v3Fn3Ugf97WVYwp+Pd0T+eJmU1F8GJNc2b35mM+6nvqeO1wN7SxAHAAAAciCI95BaD7wZfeMAnDo//gLO1BIn9ZrkUdSu9sez0GP1LPGOoFyf1+Ne6vjcjNYd66nHz9v1ebT+0mD751n3Ewf3+PXA3hPEAQAAgBwI4j10Bdo64JaheByx46VP4tfX102+rh2cgzgyTzMO6+3X9L2XURCfXL6l67Xl+zXeJ77X+OeJ9+24ZvN+6uVpEp8LsBwEcQAAACAHgnhPzUA8mtE8jsfNYJsKvPEM6q79cUhvmnasS2rGefyelXh/V8SO7yO1PEzztbNidvy+qf3j5Vb6LQcD3HqCOAAAAJADQbyn5ozldhQeR/BUIG6tjx3ZrSBevne1jEoVqHveS1cQjwP2eC318XkTQbwjeMfXi+8jvp/6utUxy6XAUhHEAQAAgBwI4j01Q3cZZlPLhoQwHC09Ur52RhRuXSMRvacdm6X52r730hXE42Opz2KRIN51PKWO6B33B9x6gjgAAACQA0F8DqP4ezi5BMgo0h4oDh6aXE+7PJZYRiVlFK7by4L0fX2XieVeel5rWhCvZ8ufGj1zfL+TS6ZMf79Zx7vEa54De0sQBwAAAHIgiM8htSZ3pV6apGM5j1HAnQzp5Wsa0Xl8/cQSJDNmh4/ev31O9b4TS7j0uJepQbz6UtH97fifem31fhPrqof32/551v00z+16D2BvCeIAAABADgTxOcxaqqNa4zqePV6/vgrDDc1z66VNWutqt0N3bCLIT2jH+z73Mis4V/E+9ayp16bubyKAT7mf1Gvj6wN7SxAHAAAAciCIAzCYIA4AAADkQBAHYDBBHAAAAMiBIA7AYII4AAAAkANBHIDBBHEAAAAgB4I4AIMJ4gAAAEAOBHEABhPEAQAAgBwI4gAMJogDAAAAORDEARhMEAcAAAByIIgDMJggDgAAAORAEAdgMEEcAAAAyIEgDsBggjgAAACQA0EcgMEEcQAAACAHgjgAgwniAAAAQA4EcQAGE8QBAACAHAjiAAwmiAMAAAA5EMQBGEwQBwAAAHIgiAMwmCAOAAAA5EAQB2AwQRwAAADIgSAOwGCCOAAAAJADQRyAwQRxAAAAIAeCOACDCeIAAABADgRxAAYTxAEAAIAcCOIZOnloo9jYf6w4t3WjdQxgLwjiAAAAQA4E8Rk2Tx0uNjY2io1DZ1vHmsf3Hb0yeX6kOr4TFg3i5es2DhcnO163uXW2OLj9rJtbV4oj+xd7H2D9COIAAABADgTxHs4dPVBG7YOnJsNwMyDX+8ogfqA4cml87ualY8W+KVG9S3X9+H0XDeJVrI+vlzouiAPzEMQBAACAHAjiPXTF4dGM6yh+J4J4MIrq7f3TVCE9DtgLB/FEwG9dd8oMcoAugjgAAACQA0G8p9bSKNuxOl4KpSuId8Xtabpes2gQr1+biN6zYjnANII4AAAAkANBfA7jGeHpGeNBZxCPliupZ52HCF1pxOjRe6WP10G8Wool8fou8X1M7p+871R4r5d/qTSOTzu/+RcH9bM3l5qZct2Ja1drtCc+e2DvCOIAAABADuogfubMGUF8hnoWdakdvctzEmE5GC2ZMp6ZHc6bjMSja0/smzZDPIrC8Qz2Ll0zwVMxO94Xx+04bKeevVp/feI60dros65b30vivoHlIIgDAAAAORDE51QH3o4wm4rCXbOyY10BOn5dcu3yRETu0orziRhfv8/2/XRdv/m8qeuEaxw8Gp5j8i8Dqvfvc936XhJLvQDLQRAHAAAAciCIz6Geyby/+wsyq/g9qePc1LIpfYN4YsmQrv2x+LpxfE5dL35N17XK11QzxstAHq47OSO8DPKLXLfHswF7QxAHAAAAciCI9zSO12GW8vxriMeqJUDi2dS3JIhHs7K7XpcK4u3YPzIZ17dnf4c/b78+XCs8a/Xe8ZeTxteLr9t1j8ByEMQBAACAHAjiPVVLpXSte13pE8T7hu6+583anzJeNqW9zEnqel33EmueV0Xwcn8Vx8vj48+n73XneTbg1hPEAQAAgBwI4j3Us5hTX0QZr+W9YBCvZ23foiBeX/tQ9/1OBPGOtb5j4xngx7aXS2k+y82fj26H8eoZe153nmcDbj1BHAAAAMiBID7D5FIpkzG2+hLJicDbJ4hXr2tE4FFcj67VMXu7Kw537U+ZWL+84zXx9VJfDlreY/T60RrhB4p9qfCdeJ4+143vBVgugjgAAACQA0F8hipUxxG3Ui2lUn+RZI8gXp4XrZ0drp+KvhNf0jnHmt/x+6VU9971bKnrpb40NJ7B3rWcTLzszMRrZlw3dS/A8hDEAQAAgBwI4gAMJogDAAAAORDEARhMEAcAAAByIIgDMJggDgAAAORAEAdgMEEcAAAAyIEgDsBggjgAAACQA0EcgMEEcQAAACAHgjgAgwniAAAAQA4EcQAGE8QBAACAHNRB/PTp04I4AAsRxAEAAIAcCOIADCaIAwAAADkQxAEYTBAHAAAAciCIAzCYIA4AAADkQBAHYDBBHAAAAMiBIA7AYII4AAAAkANBHIDBBHEAAAAgB4I4AIMJ4gAAAEAOBHEABhPEAQAAgBwI4gAMJogDAAAAORDEARhMEAcAAAByIIgDMJggDgAAAORAEAdgMEEcAAAAyIEgDsBggjgAAACQA0F8B508tFFsbNy0/1hxbutG6zjAqhLEAQAAgBysTBDf3DpbHAwxOnaL4vTk+x8ojlza/fdcxF5/TsBqEsQBAACAHKxEED939EA78A4MvXU4PnS297FlnyG+G58TQCCIAwAAADnIPojHM54PnhpH3c2tK8WRQ/OH3s1Lx4p91TWj6D3t2DLbjc8JoCKIAwAAADnIP4g3A/UOzXKeFr2nHVtmu/E5AVQEcQAAACAHqxXEo5nPKfFM6WDf0Sv18XrZk9ihs1OPlbOs91f7Dhcnt24k9jV/3kiG6c1Thyeuve/o2fFrGuennmPa2uV9PqfJ+5281sSxm/fxnZcvz/1sQeozTN0LkBdBHAAAAMhB9kE86BtZ4yg8YXu2d+pa1fFpx9rxOw7iHRqzzKeu8R1sR+bu5+gO4l3PFn9OzSDf/IuC5nuG/fM+W/c9t+8ByI8gDgAAAOQgNPDsg3h3nB0H4niGcz3Tug7AjXOnLIvSdaxPEK8C82Qcrs5tzvge7QvnTkTyKog3onUzJp87enhqEI/vZ6z5OTXuo/E5je9jkWdLn1udf0QQh+wJ4gAAAEAOViKIV9LLiGxH2SkzlONQ2xW9px2bHcTHkTu1v3NmdiJQx8uqdC1P0mXa5xSOj+P3KJRP3O/2M6eeoWt/12cGrA5BHAAAAMjBSgXxShx8wyzqVkROWJYg3pz13TWzPbX8SfM9+kh9TuX+eHmUxs/1OYln6NrfFfuB1SGIAwAAADlYySAeNJcaKaPuHFG2K3pPO5YMwYl9ned23F9qhvjE/cShf84Z2PHnVO2vg/vN9zxZnTPxpZ7tZ+ja3/WZAatDEAcAAABykH0QL2NrFIpTM58n901++WR5rOsLIONrdxxLhuDEvs5zE2tvh3NTa4iHfROzyHsE576fU30sDu0bcahvP0PX/lnv40s1IX+COAAAAJCD1QjiUbid0AzdicibPC+1xna9dnb6WDoEt/eNrpHen14GpaERxFvHtnXF5Xk+p/Y9BuP7bB+f/WzTPvuuewbyIYgDAAAAOcg/iLfC7fTQmg7DkzPGk+d1zSDfPpYKwal97XueDM2TUTzcV+PcqUF88jqxeT+n8jXNiD01mPd7tuRfJiQ+eyA/gjgAAACQg+yD+KrrsxzKbhmHd9EamE4QBwAAAHIgiC+Rk4cSa5v3mMm9G2Z9mSdAkyAOAAAA5EAQXyJT1xC/RbPD28uxmB0OzCaIAwAAADmog/iZM2cE8T3WjtG3PkhP3sP0dckBKoI4AAAAkANBHIDBBHEAAAAgB4I4AIMJ4gAAAEAOBHEABhPEAQAAgBwI4gAMJogDAAAAORDEARhMEAcAAAByIIgDMJggDgAAAORAEAdgMEEcAAAAyIEgDsBggjgAAACQA0EcgMEEcQAAACAHgjgAgwniAAAAQA4EcQAGE8QBAACAHAjiAAwmiAMAAAA5EMQBGEwQBwAAAHIgiAMwmCAOAAAA5EAQB2AwQRwAAADIQR3ET58+LYgDsBBBHAAAAMiBIA7AYII4AAAAkANBHIDBBHEAAAAgB4J4w+bWleLI/o1iY+Om/ceKc1s3Wuesmhyf+eShvO4X1oEgDgAAAORg5YL45qnDo1i6bd/RK61zuuQYh4ea95k3t84WBxufb63Ha3fC5PsfKI5c2v33BGYTxAEAAIAcrFwQr2cPLxBq543Dq2CeZz539EA7hC/wOTfVgfvQ2d7HzBCH5SOIAwAAADlYqSCenr3cfxbxPHF4VfR95vizPXhqfF55jUPdr+2yeelYsa+6ZhS9px0Dlo8gDgAAAORgpYL4eAbzgeLI0cN1vO27bErfOLxK+j7zRKCect48pkXvaceA5SOIAwAAADlYmSDeDruNGc0dAbe93vjZiWt85+XL45+jmeapQNy1pEhrNnV9zcPFyYmfx9eK77W1FEzruu3Z8am/CJj1zKn3Ll/XfN7ovVNm3U/qeUqHzk491v78biT2zf5M+34OqeeIfxcAQRwAAADIw+oE8UawrcLrOKy2A2ZXvI4jajOcNoNuav+0a1YBeTLedmjMiI5DdPKaU85pXmva/ZUS4bgpFapTYbzP/aSuVR2fdqwdv+Mg3mGBz6H7Odq/T7DuBHEAAAAgBysTxJuRsw7FzVnAzcg8Met3FFXja9RRtGOm+Tjajl8fa89ab8fbKqZPxtd06J0I8jfPP3IqOqc5s7l+9lG8neeZ4+dIPs+EcSDuez+tZ+65ZEqfID79M+3/OTR/f5rh/9zRw4I4RARxAAAAIAcrEcRTkXS0Px0/U7O7W9dJxu9EXE6sb52cgZwM4s17be/visITz945i3ksPOO8zzxNehmRxD13SAbrHQviMz7Tzs+h/Rcf8bIqfT8fWEeCOAAAAJCD1QjiPSJskJo53rm+d3J28+j8+OfWa1MWCeId8Xbi2eNomxAH8T7P3EccxuPPpsuyBPE+n0N6+ZbxewAjgjgAAACQg5UI4ulombAdVrtCc2qWcGt/c43rjmjeDLjxualIO3qP9v6uKNzU9SyxrvO6nrmv5mz4OLxPu59g2vN1HUt+Tol9ned23N+sz6EV+jvGA9aVIA4AAADkIPsg3rUsyrTjqbWlw7mpdaSr69TH9h8uDm5H1mZQHb+2Y43sRYJ4YgZ2/VynDo9mZE+cM/llj+Wx6i8BFnjmpvL10fHU/fW9n9Y9xdfuOJb+nNr7Os+d43MI+yY+845IDwjiAAAAQB7yD+IdM7ObmjPIq8A5c1b5tEBbimJv6/jonH3RMhypSFu+vmt/PDO5IbUETEtqtnqXWUE8Pr/jffreTxzUm8e7jqU+p9S+aZ9p388huRb8tmYoBwRxAAAAIA/ZB/FU7I51RfPJMBoCd3od6fIaE3G1fbz1Ptv3M2TJlPF7J+JwzyDfPGfeZ554tvj5G1Kfe9/7aZ3XNYN8+1jqc0rta9/z5Gfa53NIB/HJ6wAjgjgAAACQg+yDOOwEy6HAMII4AAAAkANBnLVz8lBibfPGLPDUjHdgOkEcAAAAyIEgztqZuoa42eGwEEEcAAAAyIEgztpJrw3eXt8c6E8QBwAAAHIgiAMwmCAOAAAA5EAQB2AwQRwAAADIgSAOwGCCOAAAAJADQRyAwQRxAAAAIAeCOACDVUE8RO55COIAAADArSSIAzBYFcQXEf8HEwAAAMBuaQXxa9euAQAAAADAyhHEAQAAAABYC60gHk8hBwAAAACAVSCIAwAAAACwFuogfubMGUEcAAAAAICVJYgDAAAAALAWBHEAAAAAANaCIA4AAAAAwFoQxAEAAAAAWAuCOAAAAAAAa0EQBwAAAABgLQjiAAAAAACsBUEcAAAAAIC1IIgDAAAAALAWBHEAAAAAANaCIA4AAAAAwFoQxAEAAAAAWAuCOAAAAAAAa0EQBwAAALjpmw8/Xxy762rxeycusSTCeIRxicdqJ7366qvFCy+8UPzgBz9gSYTxCOMSj9VOCte/fv168fzzz7Mkwnjs9rgHWQTxGzduFK+88krx0ksvlf/88Y9/3DoHAAAAYBHP/fC14tAd3y5++Y/uY0mF8QnjFI/dEG+88Ubx+OOPF+fOnWNJhfEJ4xSP3RChKz799NPFtWvXWFJhfHaz/y5lEH/55ZeLp556qgj39eCDD7b+ZQjOnz9fHg8fUIjk8TUAAAAA+gix9b/84X3Ff/3jvy1+7dgDxW987HzxG8cvsNdujkMYjzAuYXzCOMVjN0QVw0NfCpMxf/aznxW2vd/COITxCONSRfF47IZ45plnyuj6xBNPFFtbW7saXukvjEMYjzAuYXzCOMXn7JSlCeLhb3vC1PjLly/X0Ts8/HPPPVdsbm7Wv6Dhn+HnZ599trh69Wp97sMPP1zOII+vCwAAANDl/115vvilP7yv+OU//tvi14+fv+kCS+d8OT5hnMJ4xWO4iDC5sorh77zzTtxkbUuwhXGpovhOTYYNy3FUMXynZ56zM8K4VFF8t5ZPWYogHtaHqUJ4iNwher/11lvxvwfJ7c033yxDePP1r722s/8vNAAAAMBqCmtU/9If3Fe859gDiRDLsgjjE8YpjFc8hot48cUXy44UZiLblncL4xPGKYxXPIaLCJNsQ2gN7TE+xvII4xPGKYxXfGwn7GkQD8X/ySefrP9GLoTsRbfwt0bhQ7p48WLphz/8Yev9AAAAAJp+97MXi//8B/cWv/4xs8OX2s3xCeMUxisew0WEL24MPcoyKcu9hfEJ4xTGKx7DRYTVKUJotUzKcgvjE8YpjFd8bCfsWRBvrgUUfql36v895V/+5V/K5VPC2uPhG2nj9wUAAACo1EE8DrAsnd0I4rbl33YjiMf7WT4rF8RD5Q/vGb4YM6wFs9Nb+Nuj733ve2UUN1McAAAA6PLBz1wq/tNH7y3+2/GLLLkwTmG84jFchCCezyaIr6eVC+KPPvpoGat3I4ZXW4jiYaZ4WD7FmuIAAABAyiiIf60VX1k+YZwE8fXbBPH1tFJB/Nlnny1/kcMXYe72FpZPuXDhQvlFm/F9AAAAAHzgM5eK//gRQTwHYZzCeMVjuAhBPJ9NEF9PKxPEX3/99TJQ/+M//mP8u53cwizvb3/728Udd9xRfOhDHyqFP4d9fb/0IHzRZhXg4/sBAAAA1psgng9BfD03QXw9rUwQf+yxx8qlUn7605/Gv9utLawzfvvttxe33XZbUjgWzpm1vf3228Xly5fL5VPi+wEAAADW2wc+fbH4Dx/+m1Z8ZfmEcQrjFY/hIgTxfDZBfD2tRBAP8Tp8ieYzzzwT/163tjD7e1oMb0bxPjPFw+zw8C/PK6+80rovAAAAYH29/9MXi3//4b8pfu1jF1lyYZzCeMVjuAhBfP7tvvdtFBvvuqP4fnxglzdBfHdcu+d4cfzE/cXzb7zROrYMViKIhwcIv8D/9E//FP9et7awJEoVvT/4wQ8W3/zmN4s3bg5OEP4c9lXHw7mztjfffLN87xDj4/sCAAAA1lcZxH8/zyD+/vM/iRNIUbx6vXj/7Remnnvhq+Pj7739yeJC4+XFk0+2XrsswjitUhD//h3vKjY2NiLvKu641cW55yaI77w33rhW3HP8eHH8+D3FtVscpgXxWxDEH3nkkXLpkj7bn/3Zn9XBOwTweAv7quPh3D5b+GLN8JzxfQEAAADrKwTWX/z9r7bi6zJ77+euFy/G4SPamtE76AriH3+y8aKOmL4swjitRhC/r3hfGb/fd/NP0ZH3CeLxttJB/No9xfETJ4oTx48X91y7tWFaEL8FQTx8mebTTz8d/04nt/DlmVXwTq0THvZVx8O5fbZnn322XL88vi8AAABgfb3/UxeLX/xQCOKXsvDe278/MaP7wldDLN4+NhHKf1Kc+dz42GQQH+1/71dfq/cVxWvFx28fn7+MwjiF8YrHcBF7F8S3Y/j74hS+/JsgvrPeeOP54v4Tx4sT9z+/J3F6L95zHtkH8RCwwy/viy/O+vvLfltYOqUK4h/96Efjw8ltc3OzvIdwL/H9AQAAAOvptk9dLP5dRkG8OaP7xfPXWscnInc543sUueMgPi2sL6swTmG84jFcxF4F8dEyKe2Z4TlsgvjOeuP5+4sTx08U9z//xmim+Paf4/N2iyD+3e8Wp0+fLsUn7IRXX321/OXd2tqKf6cX2u655546iJ84cSI+nNzCF2r6Yk0AAACgqQziv/fV4r0fu7T03jMRsV8rjt9+ccY5o1niYf9tURA/HoX1+DrLKIxT3kH8+8Ud75pndvj2+c01xqPX1pH6+3cU72qc967kuiszrhddI47fgvjOev7+E3WQbs4WT55XrjE+OufjH/94LV5mZZ5zm0G8K45X95U6ttt2M4iHBr7rQfxHP/pR+ct748aNyd/oObe33367nMlexfAPf/jDxcsvvxyfltzCe4d7CPcS3x8AAACwnm771IXiF37v/7bi6zJ6T3NJlFevF7clgnjQjN3lbPCPRUH8yclZ5F3XWTZhnMJ4xWO4iD0J4tvBOR2rE9t974vOHS230txXRuo4Xt98Xdg30c6r2D2x8+b1qp9b99aO94L4zqm+TLMZwMcxux25Q9COZ5BX+5uhe55zmxE8zFCPj5f3Wc5iv/XrmwfZB/GdmCH+5ptvFp/85CcnYvgzzzwTn9a5mSEOAAAAxG77ywvFL/yP9QrizS2X2eFBGKcwXvEYLmIvg3jvCeKJLY7SoyAefxHnvDG7fX65lWF9fO3p19i9bSWDeGKJlK74nIrZlXhm9zznTgTxaib4PZOfTXMWe3y93ZZ9EK/WEL9+/frkb/Qc28mTJ+sY/pGPfKT8QObZrCEOAAAAxH7nLy8U/3Zlg3jHkinn21++GV9jGYVxCuMVj+Ei8gniiWVO4iCeiNST+0czyzvft+u+ov1d77Xb2yoG8ThOB1OjdGLmeOpY/PO0c+N7iI+nZrHfStkH8eDChQtzzehubmFW9/vf//4yhn/gAx8onnvuufiUmduzzz5bnD9/vnVfAAAAwPoKgfXf/O5Xivd87NLSe3diDfG+5/xOtIZ48+euay2bME5ZB/HEkifTtmo5lNYSKfMG8a7gXW3x2uERQXxnVaG5ub53UzxzPA7VTfGx+Odp58ZBvLqvanb5aBZ7+lq3wkoE8fAQV65ciX+ne20XL16sZ4d/+tOfjg/32h5++OFSfF8AAADA+sopiAfxl2HGx9/91cb64E9+v94fB/F3336tOP3q+NTmucsq/yA+R1TuiNjx6+Ofq22RIN55fHvreq/d3lYtiMdhuqlaNqXP2uKpY/HP086Ng3i8r/xzNFv9VlqJIB5mdYdf4J/8JL1m1bQtzCz/+te/XnriiSfiwzO3t956q3jwwQeLp556qnVfAAAAwPr67U9eKN71wRDEH8rCu5vLphQhbodYvH2sGcOLnxSnPzc+NhnER/vja714/pHW+y2TME5hvOIxXMReBfH2l1d2bMlIvb18yrxBvHpdZ/GedXy0db3Xbm+rFMS7lkVpHT8RL2UyOWu861rznJsK4vXa5tdCmG9f51ZaiSD++uuvl1F63rW/d2ILX+YZ/uV5+eWXW/cFAAAArK/f/uT54l0fvKcVX5dZHLLb22QMD1JBPN6fet0yCeMUxisew0XsWRAPW/lllem4fN/7qi+xHC2v0vpizOh1XZG6tb96z4noffM9xuuhTCyPUh/v8V67va1UEO/44syJc6Iv3AyRe7SUyuTM7zJoR/vmOTcZxLfDeXmN6NittptBPHxX5S0J4sEjjzxSLn8SZmzPs4WZ4dWSKeHP825Xr14tLl++3LofAAAAYL2FwPrzmQXxSnP5lHp78qnWeUFXEH/37Y9MLp2yxFE8jNNKBPFyS3xZZul9Rd2ko7W9w6zyOErHP1dbev92ZG+Y7OPb0bzjePqau7+tUhBPhelYtZZ3NZu7XupkO6aP1xpvX2eec1NBvLpGeM1efZlmZWWCePhyzDBLPPwSz7MNCeKvvfZa+S/OCy+80LofAAAAYL399xDEP3BP8e7bQxxmmYVxCuMVj+Ei9j6I2/puqxTEFxGv/T3NPOd22Ylr7ITdDOKnT9+iJVMqjz/+eBnF//mf/zn+/e7cFg3i77zzTvlFnmF2+Bt7PIgAAADA8vmtT54vfk4Qz0IYpzBe8RguQhDPZxPE+wfqec5NSa01vldWKoiHtcQfeuihMlL/67/+a/w7vqNb9X/crl+/3roPAAAAgN/6i/PFz73/y634yvIJ4xTGKx7DRQji+WyCeP/IPc+5KUNfv5NWKogH4cstz58/X64p/vbbb8e/5zuyvfrqq+W/ME8++WTr/QEAAACCEFgPCOJZCOMkiK/fJoj3j9TznBu/rmut8b2yckE8ePHFF8tf6BDFd3qmeIjhIbg//PDDlkoBAAAAOv3mX5wv9t8miOcgjFMYr3gMFyGI57OtexBfVysZxIMQxUO4DsunzLOm+LTtpZdeKtcoD89048aN1nsCAAAAVH7zLx4s9t92d/Erf3Kx+NXbH2JJhfEJ4xTGKx7DRVRB/Gc/+1mclmxLtIXx2Y0g/uMf/7h1jOURxueWBPEzZ84Ud911V+uE3RaWTwlrioeIHX6533rrrfh3v9f205/+tPygwr8kjz76qF9sAAAAYKb/efJKse937i5+6X99p/jV2y+zpML4hHEK4xWP4SKqlQvCZErb8m5hfMI4hfGKx3ARm5ubZT/c2tpqHWN5hPEJ4xTGKz62E/Y8iAfhizYff/zxMopfvHixrP8/+clP4n8Hklt4/TPPPFO+9sKFC8Wzzz7buj4AAABAyn2XnytD68//7t8Uv1LORm7HWPZWGJcwPmGcwnjFY7iIV155pQytoYm98847cW6yLcEWxiWMTxinMF7xGC4iLLMcQusTTzxhmeUlFcYljE8YpzBe8fGdsBRBvBJ+ucOa4iFuh1/2sJRKiN3hb4HCTPIw6zv8M/wc9l+6dKk8Lyy78thjj5VhPb4mAAAAwDS/8X++VUfxMBP5V/7kUivKcuuFcQjjUcXwME7x2A0RJmdWUTzMRLZ8ynJsYRzCeFQxPIxTPHZDhKZYRfEwE9kqE8shjEMYjyqGh3GKz9kpSxXEKyFsP/fcc8XVq1fLWd/hlz8WIniI52E2uV9cAAAAYFHPvvRq8ev/++/K6MpyCuMTxikeuyHCTNQqirOcwvjs9Ezu0BGffvrpMrqynML47GbvXcogHgsfQJgiH74wM8wQf+2111rnAAAAAAzxjcvPF39055XiNz/xIEsijEcYl3isdlJoTi+88EL53XYshzAeu7VcRiVc//r16+VkW5ZDGI/dHvcgiyAOAAAAAABDCeIAAAAAAKwFQRwAAAAAgLUgiAMAAAAAsBZCA6+DeKjj8QkAAAAAALAK6hnid999d/nDrfgmTwAAAAAAuJVC+66D+D333FPOEn/ppZdaJwIAAAAAQM42NzfLBr5x9erV4t577y3r+GOPPdY6EQAAAAAAcvb444+Pg/j9999f/vDAAw+0TgQAAAAAgJw9+OCDoyB+7dq14qGHHip/+MpXvlI89dRTrZMBAAAAACBHzzzzTPG1r31tHMTDOuJf//rXy2VTvvWtbxUvv/xy60UAAAAAAJCTra2teoWU0MA3HnnkkSIsmxJmiZ89e7aM4pcvX269EAAAAAAAcvIP//APZfO+++67ywZeB/EwS/zb3/52efDLX/5yGcXNFAcAAAAAIDdhZnho3KF1h+Ydvj8zNPAyiFfLpjz88MPF3//93xd33XVXKSyfYk1xAAAAAABy8fTTT0907vDn0L7LIP7oo4+WQTzMEg87r1y5UnznO98p11Q5depUKcwcf+KJJ4of/ehHxeuvv956AwAAAAAA2AuhWYd2HRp2aNshgoeuHRp3aNuhewehgZdBvLlsSgjiwcWLF4v77ruvfOFf//VfF1/60peKL37xi7U777xzLl/4whduqT//8z8vfeITn+jt9ttvL1/z8Y9/vPj85z/PDvurv/qrrHzuc5/LxokTJ9beZz/72bX3mc98Jhuf/vSn2QWf+tSnAIAMxf+Zvo7i/764zOL/Hr6O4v89to7i/12+zOLesczilsTOidvpMou78izNZh0admjZoWl/7WtfKxt3aN3V7PDQwP8/4HC1GQeouTYAAAAASUVORK5CYII=",
      "text/plain": "class java.awt.image.BufferedImage: 1476x1068 px"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {}
    }
   ],
   "source": [
    "showScreenshot(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Of course, you can depend on various JVM libraries even if you don't have a project in the current scope.\n",
    "The simpliest option we offer is to use predefined library descriptors, you can find which are available using `:help` command or [here](https://github.com/Kotlin/kotlin-jupyter#list-of-supported-libraries)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:37.406894500Z",
     "start_time": "2023-07-01T16:25:36.078898Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "Kotlin Jupyter kernel.\nKernel version: 0.11.0.381\nKotlin version: 1.8.20\nJVM version: 11\n\nCommands:\n    :help - display help\n    :classpath - show current classpath\n    :vars - get visible variables values\n\nMagics:\n    %use - injects code for supported libraries: artifact resolution, default imports, initialization code, type renderers\n        Usage: %use klaxon(5.5), lets-plot\n    %trackClasspath - logs any changes of current classpath. Useful for debugging artifact resolution failures\n        Usage: %trackClasspath [on|off]\n    %trackExecution - logs pieces of code that are going to be executed. Useful for debugging of libraries support\n        Usage: %trackExecution [all|generated|off]\n    %useLatestDescriptors - use latest versions of library descriptors available. By default, bundled descriptors are used. Note that default behavior is preferred: latest descriptors versions might be not supported by current version of kernel. So if you care about stability of the notebook, avoid using this line magic\n        Usage: %useLatestDescriptors [on|off]\n    %output - output capturing settings\n        Usage: %output --max-cell-size=1000 --no-stdout --max-time=100 --max-buffer=400\n    %logLevel - set logging level\n        Usage: %logLevel [off|error|warn|info|debug]\n\nSupported libraries:\n    kravis (https://github.com/holgerbrandl/kravis) - Kotlin grammar for data visualization\n    plotly (https://github.com/mipt-npm/plotly.kt) - [beta] Plotly.kt jupyter integration for static plots.\n    exposed (https://github.com/JetBrains/Exposed) - Kotlin SQL framework\n    lets-plot-gt (https://github.com/JetBrains/lets-plot-kotlin) - Lets-Plot visualisation for GeoTools toolkit\n    deeplearning4j (https://github.com/eclipse/deeplearning4j) - Deep learning library for the JVM\n    kraphviz (https://github.com/nidi3/graphviz-java) - Graphviz wrapper for JVM\n    serialization (https://github.com/Kotlin/kotlinx.serialization) - Kotlin multi-format reflection-less serialization\n    krangl (https://github.com/holgerbrandl/krangl) - Kotlin DSL for data wrangling\n    roboquant (https://roboquant.org) - Algorithmic trading platform written in Kotlin\n    kmath (https://github.com/mipt-npm/kmath) - Experimental Kotlin algebra-based mathematical library\n    gral (https://github.com/eseifert/gral) - Java library for displaying plots\n    webtau (https://github.com/testingisdocumenting/webtau) - WebTau end-to-end testing across layers\n    deeplearning4j-cuda (https://github.com/eclipse/deeplearning4j) - Deep learning library for the JVM (CUDA support)\n    gradle-enterprise-api-kotlin (https://github.com/gabrielfeo/gradle-enterprise-api-kotlin) - A library to use the Gradle Enterprise API in Kotlin scripts or projects\n    coroutines (https://github.com/Kotlin/kotlinx.coroutines) - Asynchronous programming and reactive streams support\n    mysql (https://github.com/mysql/mysql-connector-j) - MySql JDBC Connector\n    lets-plot-dataframe (https://github.com/JetBrains/lets-plot-kotlin) - A bridge between Lets-Plot and dataframe libraries\n    multik (https://github.com/Kotlin/multik) - Multidimensional array library for Kotlin\n    reflection (https://kotlinlang.org/docs/reflection.html) - Imports for Kotlin Reflection\n    smile (https://github.com/haifengl/smile) - Statistical Machine Intelligence and Learning Engine\n    kandy-echarts (https://github.com/Kotlin/kandy) - Kotlin plotting DSL for Apache ECharts\n    spark-streaming (https://github.com/JetBrains/kotlin-spark-api) - Kotlin API for Apache Spark Streaming: scalable, high-throughput, fault-tolerant stream processing of live data streams\n    rdkit (https://www.rdkit.org/) - Open-Source Cheminformatics Software\n    combinatoricskt (https://github.com/shiguruikai/combinatoricskt) - A combinatorics library for Kotlin\n    lib-ext (https://github.com/Kotlin/kotlin-jupyter) - Extended functionality for Jupyter kernel\n    khttp (https://github.com/jkcclemens/khttp) - HTTP networking library\n    plotly-server (https://github.com/mipt-npm/plotly.kt) - [beta] Plotly.kt jupyter integration for dynamic plots.\n    londogard-nlp-toolkit (https://github.com/londogard/londogard-nlp-toolkit) - A Natural Language Processing (NLP) toolkit for Kotlin on the JVM\n    lets-plot (https://github.com/JetBrains/lets-plot-kotlin) - ggplot-like interactive visualization for Kotlin\n    openai (https://openai.com/blog/chatgpt) - OpenAI API for Jupyter Notebooks\n    fuel (https://github.com/kittinunf/fuel) - HTTP networking library\n    kalasim (https://www.kalasim.org) - Discrete event simulator\n    kaliningraph (https://github.com/breandan/kaliningraph) - Graph library with a DSL for constructing graphs and visualizing the behavior of graph algorithms\n    kandy (https://github.com/Kotlin/kandy) - Kotlin plotting DSL for Lets-Plot\n    kotlin-dl (https://github.com/Kotlin/kotlindl) - KotlinDL library which provides Keras-like API for deep learning\n    kotlin-statistics (https://github.com/thomasnield/kotlin-statistics) - Idiomatic statistical operators for Kotlin\n    jdsp (https://github.com/psambit9791/jDSP) - Java library for signal processing\n    default - Default imports: dataframe and Lets-Plot libraries\n    dataframe (https://github.com/Kotlin/dataframe) - Kotlin framework for structured data processing\n    biokotlin (https://bitbucket.org/bucklerlab/biokotlin) - BioKotlin aims to be a high-performance bioinformatics library that brings the power and speed of compiled programming languages to scripting and big data environments.\n    klaxon (https://github.com/cbeust/klaxon) - JSON parser for Kotlin\n    datetime (https://github.com/Kotlin/kotlinx-datetime) - Kotlin date/time library\n    spark (https://github.com/JetBrains/kotlin-spark-api) - Kotlin API for Apache Spark: unified analytics engine for large-scale data processing"
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    ":help"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's try `kotlinx.serialization` library"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:37.473896800Z",
     "start_time": "2023-07-01T16:25:36.162916800Z"
    }
   },
   "outputs": [],
   "source": [
    "%use serialization"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It allows us to serialize and deserialize classes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:38.138906600Z",
     "start_time": "2023-07-01T16:25:36.568902400Z"
    }
   },
   "outputs": [],
   "source": [
    "import kotlinx.serialization.Serializable\n",
    "\n",
    "@Serializable\n",
    "class User(val firstName: String, val lastName: String)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:38.274904200Z",
     "start_time": "2023-07-01T16:25:37.334915300Z"
    }
   },
   "outputs": [],
   "source": [
    "val bob = User(\"Alex\", \"Green\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:38.381895900Z",
     "start_time": "2023-07-01T16:25:37.448897700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "{\n    \"firstName\": \"Alex\",\n    \"lastName\": \"Green\"\n}"
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Json { prettyPrint = true }.encodeToString(bob)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It is possible to specify descriptors' and underlying libraries' versions, write and contribute your own descriptors and much more.\n",
    "You can read about it [here](https://github.com/Kotlin/kotlin-jupyter/blob/master/docs/libraries.md)\n",
    "\n",
    "Also, you can add dependencies for any Maven libraries you want"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:41.991897100Z",
     "start_time": "2023-07-01T16:25:37.838994200Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": ""
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {}
    },
    {
     "data": {
      "text/html": "            <div id=\"kotlin_out_0\"/>\n            <script type=\"text/javascript\">\n                            if(!window.kotlinQueues) {\n                window.kotlinQueues = {};\n            }\n            if(!window.kotlinQueues[\"kandyLetsPlot\"]) {\n                var resQueue = [];\n                window.kotlinQueues[\"kandyLetsPlot\"] = resQueue;\n                window[\"call_kandyLetsPlot\"] = function(f) {\n                    resQueue.push(f);\n                }\n            }\n            (function (){\n                var modifiers = [(function(script) {\n    script.src = \"https://cdn.jsdelivr.net/gh/JetBrains/lets-plot@v3.1.0/js-package/distr/lets-plot.min.js\"\n    script.type = \"text/javascript\";\n})];\n                var e = document.getElementById(\"kotlin_out_0\");\n                modifiers.forEach(function (gen) {\n                    var script = document.createElement(\"script\");\n                    gen(script)\n                    script.addEventListener(\"load\", function() {\n                        window[\"call_kandyLetsPlot\"] = function(f) {f();};\n                        window.kotlinQueues[\"kandyLetsPlot\"].forEach(function(f) {f();});\n                        window.kotlinQueues[\"kandyLetsPlot\"] = [];\n                    }, false);\n                    script.addEventListener(\"error\", function() {\n                        window[\"call_kandyLetsPlot\"] = function(f) {};\n                        window.kotlinQueues[\"kandyLetsPlot\"] = [];\n                        var div = document.createElement(\"div\");\n                        div.style.color = 'darkred';\n                        div.textContent = 'Error loading resource kandyLetsPlot';\n                        document.getElementById(\"kotlin_out_0\").appendChild(div);\n                    }, false);\n                    \n                    e.appendChild(script);\n                });\n            })();\n            </script>"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {}
    }
   ],
   "source": [
    "USE {\n",
    "    repositories {\n",
    "        // Any additional repositories. Maven central is already included\n",
    "        // maven(\"<url>\")\n",
    "    }\n",
    "    dependencies {\n",
    "        // Here we add kandy plotting library\n",
    "        implementation(\"org.jetbrains.kotlinx:kandy-lets-plot:0.4.3\")\n",
    "    }\n",
    "\n",
    "    // Sometimes library integration are loaded transitively and you don't want them to do it.\n",
    "    discardIntegrationTypeNameIf {\n",
    "        it.startsWith(\"org.jetbrains.kotlinx.dataframe.\")\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Renderers and other integration features\n",
    "\n",
    "Let's try to conduct an experiment: we'll throw 50 dices and count the sum of points on them.\n",
    "Then, we'll repeat this experiment some reasonable number of times and plot the distribution using kandy library we've just loaded."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:45.532895800Z",
     "start_time": "2023-07-01T16:25:41.881901100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": "            <script type=\"text/javascript\" data-lets-plot-script=\"library\" src=\"https://cdn.jsdelivr.net/gh/JetBrains/lets-plot@v3.1.0/js-package/distr/lets-plot.min.js\"></script>    \n               <div id=\"418AWl\"></div>\n   <script type=\"text/javascript\" data-lets-plot-script=\"plot\">\n       var plotSpec={\n\"mapping\":{\n},\n\"data\":{\n\"x\":[124.0,127.0,128.0,129.0,130.0,131.0,132.0,133.0,134.0,135.0,136.0,137.0,138.0,139.0,140.0,141.0,142.0,143.0,144.0,145.0,146.0,147.0,148.0,149.0,150.0,151.0,152.0,153.0,154.0,155.0,156.0,157.0,158.0,159.0,160.0,161.0,162.0,163.0,164.0,165.0,166.0,167.0,168.0,169.0,170.0,171.0,172.0,173.0,174.0,175.0,176.0,177.0,178.0,179.0,180.0,181.0,182.0,183.0,184.0,185.0,186.0,187.0,188.0,189.0,190.0,191.0,192.0,193.0,194.0,195.0,196.0,197.0,198.0,199.0,200.0,201.0,202.0,203.0,204.0,205.0,206.0,207.0,208.0,209.0,210.0,211.0,212.0,213.0,214.0,215.0,216.0,217.0,218.0,219.0,220.0,221.0,222.0,223.0,226.0,228.0],\n\"y\":[1.0,1.0,2.0,5.0,1.0,2.0,7.0,7.0,2.0,16.0,13.0,29.0,30.0,33.0,40.0,49.0,77.0,102.0,116.0,179.0,178.0,235.0,266.0,327.0,359.0,453.0,567.0,675.0,705.0,870.0,928.0,1051.0,1230.0,1353.0,1496.0,1765.0,1852.0,2041.0,2244.0,2324.0,2381.0,2687.0,2763.0,2935.0,3074.0,3045.0,3262.0,3193.0,3239.0,3263.0,3222.0,3241.0,3177.0,3150.0,3113.0,2834.0,2838.0,2666.0,2449.0,2421.0,2223.0,2066.0,1830.0,1706.0,1597.0,1424.0,1226.0,1066.0,958.0,816.0,716.0,643.0,532.0,495.0,385.0,322.0,272.0,245.0,164.0,143.0,128.0,101.0,93.0,58.0,63.0,37.0,16.0,23.0,15.0,13.0,10.0,9.0,4.0,5.0,6.0,2.0,1.0,1.0,1.0,1.0]\n},\n\"kind\":\"plot\",\n\"scales\":[{\n\"aesthetic\":\"x\",\n\"limits\":[null,null]\n},{\n\"aesthetic\":\"y\",\n\"limits\":[null,null]\n}],\n\"layers\":[{\n\"mapping\":{\n\"x\":\"x\",\n\"y\":\"y\"\n},\n\"stat\":\"identity\",\n\"sampling\":\"none\",\n\"position\":\"dodge\",\n\"geom\":\"bar\",\n\"data\":{\n}\n}]\n};\n       var plotContainer = document.getElementById(\"418AWl\");\n       LetsPlot.buildPlotFromProcessedSpecs(plotSpec, -1, -1, plotContainer);\n   </script>            \n        <svg id=5cb3bcb1-3305-4ea9-859e-a8dc5424bebb xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" class=\"plt-container\" width=\"600.0\" height=\"400.0\">\n  <style type=\"text/css\">\n  .plt-container {\n   font-family: Lucida Grande, sans-serif;\n   user-select: none;\n   -webkit-user-select: none;\n   -moz-user-select: none;\n   -ms-user-select: none;\n}\ntext {\n   text-rendering: optimizeLegibility;\n}\n#pHV99IC .plot-title {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 16.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .plot-subtitle {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 15.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .plot-caption {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .legend-title {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 15.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .legend-item {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .axis-title-x {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 15.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .axis-text-x {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#dk9cpxy .axis-tooltip-text-x {\n   fill: #ffffff;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .axis-title-y {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 15.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .axis-text-y {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#dk9cpxy .axis-tooltip-text-y {\n   fill: #ffffff;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .facet-strip-text-x {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#pHV99IC .facet-strip-text-y {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#dk9cpxy .tooltip-text {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: normal;\n   font-style: normal;   \n}\n#dk9cpxy .tooltip-title {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: bold;\n   font-style: normal;   \n}\n#dk9cpxy .tooltip-label {\n   fill: #474747;\n   font-family: Lucida Grande, sans-serif;\n   font-size: 13.0px;\n   font-weight: bold;\n   font-style: normal;   \n}\n\n  </style>\n  <g id=\"pHV99IC\">\n    <rect x=\"0.0\" y=\"0.0\" height=\"400.0\" width=\"600.0\" stroke=\"rgb(71,71,71)\" stroke-opacity=\"1.0\" stroke-width=\"0.0\" fill=\"rgb(255,255,255)\" fill-opacity=\"1.0\">\n    </rect>\n    <g transform=\"translate(23.0 10.0 ) \">\n      <g transform=\"translate(42.99591213121782 344.0 ) \">\n        <line x1=\"7.697260845286337\" y1=\"-0.0\" x2=\"7.697260845286337\" y2=\"-344.0\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"98.52039766282371\" y1=\"-0.0\" x2=\"98.52039766282371\" y2=\"-344.0\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"189.3435344803612\" y1=\"-0.0\" x2=\"189.3435344803612\" y2=\"-344.0\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"280.1666712978986\" y1=\"-0.0\" x2=\"280.1666712978986\" y2=\"-344.0\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"370.98980811543595\" y1=\"-0.0\" x2=\"370.98980811543595\" y2=\"-344.0\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"461.81294493297344\" y1=\"-0.0\" x2=\"461.81294493297344\" y2=\"-344.0\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <g transform=\"translate(7.697260845286337 0.0 ) \">\n          <line stroke-width=\"1.0\" stroke=\"rgb(71,71,71)\" stroke-opacity=\"1.0\" x2=\"0.0\" y2=\"4.0\">\n          </line>\n          <g transform=\"translate(0.0 7.0 ) \">\n            <text class=\"axis-text-x\" text-anchor=\"middle\" dy=\"0.7em\">\n            120\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(98.52039766282371 0.0 ) \">\n          <line stroke-width=\"1.0\" stroke=\"rgb(71,71,71)\" stroke-opacity=\"1.0\" x2=\"0.0\" y2=\"4.0\">\n          </line>\n          <g transform=\"translate(0.0 7.0 ) \">\n            <text class=\"axis-text-x\" text-anchor=\"middle\" dy=\"0.7em\">\n            140\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(189.3435344803612 0.0 ) \">\n          <line stroke-width=\"1.0\" stroke=\"rgb(71,71,71)\" stroke-opacity=\"1.0\" x2=\"0.0\" y2=\"4.0\">\n          </line>\n          <g transform=\"translate(0.0 7.0 ) \">\n            <text class=\"axis-text-x\" text-anchor=\"middle\" dy=\"0.7em\">\n            160\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(280.1666712978986 0.0 ) \">\n          <line stroke-width=\"1.0\" stroke=\"rgb(71,71,71)\" stroke-opacity=\"1.0\" x2=\"0.0\" y2=\"4.0\">\n          </line>\n          <g transform=\"translate(0.0 7.0 ) \">\n            <text class=\"axis-text-x\" text-anchor=\"middle\" dy=\"0.7em\">\n            180\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(370.98980811543595 0.0 ) \">\n          <line stroke-width=\"1.0\" stroke=\"rgb(71,71,71)\" stroke-opacity=\"1.0\" x2=\"0.0\" y2=\"4.0\">\n          </line>\n          <g transform=\"translate(0.0 7.0 ) \">\n            <text class=\"axis-text-x\" text-anchor=\"middle\" dy=\"0.7em\">\n            200\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(461.81294493297344 0.0 ) \">\n          <line stroke-width=\"1.0\" stroke=\"rgb(71,71,71)\" stroke-opacity=\"1.0\" x2=\"0.0\" y2=\"4.0\">\n          </line>\n          <g transform=\"translate(0.0 7.0 ) \">\n            <text class=\"axis-text-x\" text-anchor=\"middle\" dy=\"0.7em\">\n            220\n            </text>\n          </g>\n        </g>\n        <line x1=\"0.0\" y1=\"0.0\" x2=\"524.0040878687822\" y2=\"0.0\" stroke-width=\"1.0\" stroke=\"rgb(71,71,71)\" stroke-opacity=\"1.0\">\n        </line>\n      </g>\n      <g transform=\"translate(42.99591213121782 0.0 ) \">\n        <line x1=\"0.0\" y1=\"293.79787808473066\" x2=\"524.0040878687822\" y2=\"293.79787808473066\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"0.0\" y1=\"243.59575616946137\" x2=\"524.0040878687822\" y2=\"243.59575616946137\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"0.0\" y1=\"193.39363425419205\" x2=\"524.0040878687822\" y2=\"193.39363425419205\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"0.0\" y1=\"143.1915123389227\" x2=\"524.0040878687822\" y2=\"143.1915123389227\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"0.0\" y1=\"92.98939042365339\" x2=\"524.0040878687822\" y2=\"92.98939042365339\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <line x1=\"0.0\" y1=\"42.7872685083841\" x2=\"524.0040878687822\" y2=\"42.7872685083841\" stroke=\"rgb(233,233,233)\" stroke-opacity=\"1.0\" stroke-width=\"1.0\">\n        </line>\n        <g transform=\"translate(0.0 344.0 ) \">\n          <g transform=\"translate(-3.0 0.0 ) \">\n            <text class=\"axis-text-y\" text-anchor=\"end\" dy=\"0.35em\">\n            0\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(0.0 293.79787808473066 ) \">\n          <g transform=\"translate(-3.0 0.0 ) \">\n            <text class=\"axis-text-y\" text-anchor=\"end\" dy=\"0.35em\">\n            500\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(0.0 243.59575616946137 ) \">\n          <g transform=\"translate(-3.0 0.0 ) \">\n            <text class=\"axis-text-y\" text-anchor=\"end\" dy=\"0.35em\">\n            1,000\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(0.0 193.39363425419205 ) \">\n          <g transform=\"translate(-3.0 0.0 ) \">\n            <text class=\"axis-text-y\" text-anchor=\"end\" dy=\"0.35em\">\n            1,500\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(0.0 143.1915123389227 ) \">\n          <g transform=\"translate(-3.0 0.0 ) \">\n            <text class=\"axis-text-y\" text-anchor=\"end\" dy=\"0.35em\">\n            2,000\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(0.0 92.98939042365339 ) \">\n          <g transform=\"translate(-3.0 0.0 ) \">\n            <text class=\"axis-text-y\" text-anchor=\"end\" dy=\"0.35em\">\n            2,500\n            </text>\n          </g>\n        </g>\n        <g transform=\"translate(0.0 42.7872685083841 ) \">\n          <g transform=\"translate(-3.0 0.0 ) \">\n            <text class=\"axis-text-y\" text-anchor=\"end\" dy=\"0.35em\">\n            3,000\n            </text>\n          </g>\n        </g>\n      </g>\n      <g transform=\"translate(42.99591213121782 0.0 ) \" clip-path=\"url(#cg3BWNK)\" clip-bounds-jfx=\"[rect (0.0, 0.0), (524.0040878687822, 344.0)]\">\n        <defs>\n          <clipPath id=\"cg3BWNK\">\n            <rect x=\"0.0\" y=\"0.0\" width=\"524.0040878687822\" height=\"344.0\">\n            </rect>\n          </clipPath>\n        </defs>\n        <rect x=\"496.0986790815938\" y=\"343.89959575616945\" height=\"0.10040424383055324\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"487.0163653998401\" y=\"343.89959575616945\" height=\"0.10040424383055324\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"473.3928948772095\" y=\"343.89959575616945\" height=\"0.10040424383055324\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"468.85173803633256\" y=\"343.89959575616945\" height=\"0.10040424383055324\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"464.3105811954557\" y=\"343.79919151233895\" height=\"0.20080848766104964\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"459.76942435457886\" y=\"343.3975745370168\" height=\"0.6024254629832058\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"455.228267513702\" y=\"343.4979787808473\" height=\"0.5020212191527094\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"450.68711067282516\" y=\"343.59838302467784\" height=\"0.4016169753221561\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"446.1459538319483\" y=\"343.09636180552513\" height=\"0.9036381944748655\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"441.60479699107134\" y=\"342.99595756169464\" height=\"1.0040424383053619\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"437.0636401501945\" y=\"342.694744830203\" height=\"1.3052551697970216\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"432.52248330931764\" y=\"342.49393634254193\" height=\"1.5060636574580712\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"427.9813264684408\" y=\"341.6907023918976\" height=\"2.3092976081023835\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"423.44016962756393\" y=\"342.3935320987114\" height=\"1.6064679012886245\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"418.8990127866871\" y=\"340.2850429782701\" height=\"3.7149570217299015\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"414.3578559458101\" y=\"337.67453263867606\" height=\"6.325467361323945\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"409.81669910493326\" y=\"338.17655385782876\" height=\"5.823446142171235\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"405.2755422640564\" y=\"334.6624053237599\" height=\"9.337594676240087\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"400.73438542317956\" y=\"333.8591713731156\" height=\"10.1408286268844\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"396.1932285823027\" y=\"331.14825678969106\" height=\"12.851743210308939\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"391.65207174142586\" y=\"329.642193132233\" height=\"14.35780686776701\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"387.1109149005489\" y=\"327.53370401179166\" height=\"16.466295988208344\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"382.56975805967204\" y=\"319.40096026151804\" height=\"24.599039738481963\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"378.0286012187952\" y=\"316.6900456780935\" height=\"27.309954321906503\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"373.48744437791834\" y=\"311.6698334865666\" height=\"32.330166513433426\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"368.9462875370415\" y=\"305.34436612524263\" height=\"38.65563387475737\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"364.40513069616463\" y=\"294.29989930388336\" height=\"49.700100696116635\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"359.86397385528767\" y=\"290.58494228215346\" height=\"53.41505771784654\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"355.3228170144108\" y=\"279.44007121696364\" height=\"64.55992878303636\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"350.78166017353396\" y=\"272.11056141733434\" height=\"71.88943858266566\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"346.2405033326571\" y=\"262.0701370342805\" height=\"81.92986296571951\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"341.69934649178026\" y=\"247.81273441034398\" height=\"96.18726558965602\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"337.1581896509033\" y=\"236.96907607664582\" height=\"107.03092392335418\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"332.61703281002644\" y=\"220.90439706375963\" height=\"123.09560293624037\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"328.0758759691496\" y=\"201.02435678531296\" height=\"142.97564321468704\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"323.53471912827274\" y=\"183.65442260262978\" height=\"160.34557739737022\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"318.9935622873959\" y=\"172.71036002510107\" height=\"171.28963997489893\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"314.45240544651904\" y=\"160.26023379011428\" height=\"183.73976620988572\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"309.9112486056421\" y=\"136.56483224610716\" height=\"207.43516775389284\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"305.3700917647652\" y=\"120.8013659647126\" height=\"223.1986340352874\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"300.82893492388837\" y=\"100.92132568626596\" height=\"243.07867431373404\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"296.2877780830115\" y=\"98.11000685901087\" height=\"245.88999314098913\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"291.74662124213467\" y=\"76.322285947784\" height=\"267.677714052216\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"287.2054644012578\" y=\"59.05275600893134\" height=\"284.94724399106866\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"282.66430756038085\" y=\"59.454372984253496\" height=\"284.5456270157465\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"278.123150719504\" y=\"31.441588955533234\" height=\"312.55841104446677\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"273.58199387862715\" y=\"27.726631933803276\" height=\"316.2733680661967\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"269.0408370377503\" y=\"25.015717350378736\" height=\"318.98428264962126\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"264.49968019687344\" y=\"18.58984574522424\" height=\"325.41015425477576\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"259.9585233559966\" y=\"20.497526378004522\" height=\"323.5024736219955\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"255.41736651511962\" y=\"16.380952380952408\" height=\"327.6190476190476\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"250.87620967424277\" y=\"18.790654232885345\" height=\"325.20934576711466\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"246.33505283336592\" y=\"23.40924944909011\" height=\"320.5907505509099\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"241.79389599248907\" y=\"16.48135662478296\" height=\"327.51864337521704\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"237.25273915161222\" y=\"38.26907753600983\" height=\"305.73092246399017\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"232.71158231073537\" y=\"35.35735446492424\" height=\"308.64264553507576\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"228.1704254698584\" y=\"49.313544357369096\" height=\"294.6864556426309\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"223.62926862898155\" y=\"66.58307429622175\" height=\"277.41692570377825\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"219.0881117881047\" y=\"74.21379682734266\" height=\"269.78620317265734\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"214.54695494722785\" y=\"104.93749543948749\" height=\"239.0625045605125\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"210.005798106351\" y=\"110.6605373378282\" height=\"233.3394626621718\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"205.46464126547414\" y=\"118.6928768442713\" height=\"225.3071231557287\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"200.92348442459718\" y=\"139.07493834187062\" height=\"204.92506165812938\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"196.38232758372033\" y=\"158.05134042584243\" height=\"185.94865957415757\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"191.84117074284347\" y=\"166.7865096390993\" height=\"177.2134903609007\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"187.30001390196662\" y=\"193.79525122951418\" height=\"150.20474877048582\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"182.75885706108977\" y=\"208.15305809728122\" height=\"135.84694190271878\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"178.2177002202128\" y=\"220.50278008843748\" height=\"123.49721991156252\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"173.67654337933595\" y=\"238.4751397341039\" height=\"105.52486026589611\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"169.1353865384591\" y=\"250.82486172526012\" height=\"93.17513827473988\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"164.59422969758225\" y=\"256.6483078674314\" height=\"87.35169213256859\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"160.0530728567054\" y=\"273.21500809947025\" height=\"70.78499190052975\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"155.51191601582855\" y=\"276.2271354143864\" height=\"67.7728645856136\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"150.97075917495158\" y=\"287.0707937480846\" height=\"56.92920625191539\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"146.42960233407473\" y=\"298.516877544766\" height=\"45.483122455234025\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"141.88844549319788\" y=\"307.9548764648366\" height=\"36.045123535163384\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"137.34728865232103\" y=\"311.16781226741386\" height=\"32.832187732586135\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"132.80613181144417\" y=\"317.2924711410767\" height=\"26.707528858923297\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"128.26497497056732\" y=\"320.4050026998234\" height=\"23.5949973001766\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"123.72381812969036\" y=\"326.12804459816414\" height=\"17.871955401835862\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"119.1826612888135\" y=\"326.0276403543336\" height=\"17.972359645666415\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"114.64150444793665\" y=\"332.35310771565753\" height=\"11.64689228434247\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"110.1003476070598\" y=\"333.75876712928505\" height=\"10.241232870714953\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"105.55919076618295\" y=\"336.26887322504854\" height=\"7.731126774951463\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"101.0180339253061\" y=\"339.08019205230363\" height=\"4.91980794769637\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"96.47687708442913\" y=\"339.98383024677844\" height=\"4.016169753221561\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"91.93572024355228\" y=\"340.6866599535922\" height=\"3.313340046407802\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"87.39456340267543\" y=\"340.98787268508386\" height=\"3.0121273149161425\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"82.85340656179858\" y=\"341.08827692891435\" height=\"2.911723071085646\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"78.31224972092173\" y=\"342.694744830203\" height=\"1.3052551697970216\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"73.77109288004488\" y=\"342.3935320987114\" height=\"1.6064679012886245\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"69.22993603916791\" y=\"343.79919151233895\" height=\"0.20080848766104964\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"64.68877919829106\" y=\"343.29717029318624\" height=\"0.702829706813759\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"60.14762235741421\" y=\"343.29717029318624\" height=\"0.702829706813759\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"55.606465516537355\" y=\"343.79919151233895\" height=\"0.20080848766104964\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"51.0653086756605\" y=\"343.89959575616945\" height=\"0.10040424383055324\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"46.52415183478354\" y=\"343.4979787808473\" height=\"0.5020212191527094\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"41.982994993906686\" y=\"343.79919151233895\" height=\"0.20080848766104964\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"37.441838153029835\" y=\"343.89959575616945\" height=\"0.10040424383055324\" width=\"4.087041156789155\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n        <rect x=\"23.818367630399166\" y=\"343.89959575616945\" height=\"0.10040424383055324\" width=\"4.087041156789269\" stroke=\"rgb(0,0,0)\" stroke-opacity=\"0.0\" fill=\"rgb(17,142,216)\" fill-opacity=\"1.0\" stroke-width=\"1.0\">\n        </rect>\n      </g>\n    </g>\n    <g transform=\"translate(14.5 182.0 ) rotate(-90.0 ) \">\n      <text class=\"axis-title-y\" y=\"0.0\" text-anchor=\"middle\">\n      y\n      </text>\n    </g>\n    <g transform=\"translate(327.99795606560895 391.5 ) \">\n      <text class=\"axis-title-x\" y=\"0.0\" text-anchor=\"middle\">\n      x\n      </text>\n    </g>\n  </g>\n  <g id=\"dk9cpxy\">\n  </g>\n</svg>\n        <script>document.getElementById(\"5cb3bcb1-3305-4ea9-859e-a8dc5424bebb\").style.display = \"none\";</script>",
      "application/plot+json": {
       "output_type": "lets_plot_spec",
       "output": {
        "mapping": {},
        "data": {
         "x": [
          124.0,
          127.0,
          128.0,
          129.0,
          130.0,
          131.0,
          132.0,
          133.0,
          134.0,
          135.0,
          136.0,
          137.0,
          138.0,
          139.0,
          140.0,
          141.0,
          142.0,
          143.0,
          144.0,
          145.0,
          146.0,
          147.0,
          148.0,
          149.0,
          150.0,
          151.0,
          152.0,
          153.0,
          154.0,
          155.0,
          156.0,
          157.0,
          158.0,
          159.0,
          160.0,
          161.0,
          162.0,
          163.0,
          164.0,
          165.0,
          166.0,
          167.0,
          168.0,
          169.0,
          170.0,
          171.0,
          172.0,
          173.0,
          174.0,
          175.0,
          176.0,
          177.0,
          178.0,
          179.0,
          180.0,
          181.0,
          182.0,
          183.0,
          184.0,
          185.0,
          186.0,
          187.0,
          188.0,
          189.0,
          190.0,
          191.0,
          192.0,
          193.0,
          194.0,
          195.0,
          196.0,
          197.0,
          198.0,
          199.0,
          200.0,
          201.0,
          202.0,
          203.0,
          204.0,
          205.0,
          206.0,
          207.0,
          208.0,
          209.0,
          210.0,
          211.0,
          212.0,
          213.0,
          214.0,
          215.0,
          216.0,
          217.0,
          218.0,
          219.0,
          220.0,
          221.0,
          222.0,
          223.0,
          226.0,
          228.0
         ],
         "y": [
          1.0,
          1.0,
          2.0,
          5.0,
          1.0,
          2.0,
          7.0,
          7.0,
          2.0,
          16.0,
          13.0,
          29.0,
          30.0,
          33.0,
          40.0,
          49.0,
          77.0,
          102.0,
          116.0,
          179.0,
          178.0,
          235.0,
          266.0,
          327.0,
          359.0,
          453.0,
          567.0,
          675.0,
          705.0,
          870.0,
          928.0,
          1051.0,
          1230.0,
          1353.0,
          1496.0,
          1765.0,
          1852.0,
          2041.0,
          2244.0,
          2324.0,
          2381.0,
          2687.0,
          2763.0,
          2935.0,
          3074.0,
          3045.0,
          3262.0,
          3193.0,
          3239.0,
          3263.0,
          3222.0,
          3241.0,
          3177.0,
          3150.0,
          3113.0,
          2834.0,
          2838.0,
          2666.0,
          2449.0,
          2421.0,
          2223.0,
          2066.0,
          1830.0,
          1706.0,
          1597.0,
          1424.0,
          1226.0,
          1066.0,
          958.0,
          816.0,
          716.0,
          643.0,
          532.0,
          495.0,
          385.0,
          322.0,
          272.0,
          245.0,
          164.0,
          143.0,
          128.0,
          101.0,
          93.0,
          58.0,
          63.0,
          37.0,
          16.0,
          23.0,
          15.0,
          13.0,
          10.0,
          9.0,
          4.0,
          5.0,
          6.0,
          2.0,
          1.0,
          1.0,
          1.0,
          1.0
         ]
        },
        "kind": "plot",
        "scales": [
         {
          "aesthetic": "x",
          "limits": [
           null,
           null
          ]
         },
         {
          "aesthetic": "y",
          "limits": [
           null,
           null
          ]
         }
        ],
        "layers": [
         {
          "mapping": {
           "x": "x",
           "y": "y"
          },
          "stat": "identity",
          "sampling": "none",
          "position": "dodge",
          "geom": "bar"
         }
        ]
       },
       "apply_color_scheme": true,
       "swing_enabled": true
      }
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import kotlin.random.Random\n",
    "\n",
    "fun diceNTimesSum(n: Int): Int {\n",
    "    return (1..n).sumOf { Random.nextInt(1, 7) }\n",
    "}\n",
    "\n",
    "val experimentData = (1..100000).map { diceNTimesSum(50) }.groupBy { it }.mapValues { it.value.size }.entries.sortedBy { it.key }\n",
    "val experimentX = experimentData.map { it.key }\n",
    "val experimentY = experimentData.map { it.value }\n",
    "\n",
    "val gaussPlot = plot {\n",
    "    bars {\n",
    "        x(experimentX)\n",
    "        y(experimentY)\n",
    "    }\n",
    "}\n",
    "gaussPlot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:25:46.133896700Z",
     "start_time": "2023-07-01T16:25:45.479975700Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "class org.jetbrains.kotlinx.kandy.ir.Plot"
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gaussPlot::class"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see kandy's `Plot` object was rendered to some image. That's because `kandy` library defines a **renderer** for this type of objects. We also can define renderers ourselves."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:03.095894200Z",
     "start_time": "2023-07-01T16:25:45.742906200Z"
    }
   },
   "outputs": [],
   "source": [
    "%use dataframe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:03.180935500Z",
     "start_time": "2023-07-01T16:26:02.956908Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "Line_23_jupyter$User@26989de3"
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val bob = User(\"Bob\", \"Brown\")\n",
    "bob"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`User` isn't a data class, that's why it was rendered this way."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:04.125939100Z",
     "start_time": "2023-07-01T16:26:03.111033100Z"
    }
   },
   "outputs": [],
   "source": [
    "USE {\n",
    "    // Match is based on runtime type here, beware of type erasure\n",
    "    render<User> { listOf(it).toDataFrame() }\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:04.212895400Z",
     "start_time": "2023-07-01T16:26:03.492908100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": "            <iframe onload=\"o_resize_iframe_out_1()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_1\" frameBorder=\"0\" srcdoc=\"        &lt;html&gt;\n        &lt;head&gt;\n            &lt;style type=&quot;text&sol;css&quot;&gt;\n                :root {\n    --background: #fff;\n    --background-odd: #f5f5f5;\n    --background-hover: #d9edfd;\n    --header-text-color: #474747;\n    --text-color: #848484;\n    --text-color-dark: #000;\n    --text-color-medium: #737373;\n    --text-color-pale: #b3b3b3;\n    --inner-border-color: #aaa;\n    --bold-border-color: #000;\n    --link-color: #296eaa;\n    --link-color-pale: #296eaa;\n    --link-hover: #1a466c;\n}\n\n:root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n    --background: #303030;\n    --background-odd: #3c3c3c;\n    --background-hover: #464646;\n    --header-text-color: #dddddd;\n    --text-color: #b3b3b3;\n    --text-color-dark: #dddddd;\n    --text-color-medium: #b2b2b2;\n    --text-color-pale: #737373;\n    --inner-border-color: #707070;\n    --bold-border-color: #777777;\n    --link-color: #008dc0;\n    --link-color-pale: #97e1fb;\n    --link-hover: #00688e;\n}\n\np.dataframe_description {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe {\n    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n    font-size: 12px;\n    background-color: var(--background);\n    color: var(--text-color-dark);\n    border: none;\n    border-collapse: collapse;\n}\n\ntable.dataframe th, td {\n    padding: 6px;\n    border: 1px solid transparent;\n    text-align: left;\n}\n\ntable.dataframe th {\n    background-color: var(--background);\n    color: var(--header-text-color);\n}\n\ntable.dataframe td {\n    vertical-align: top;\n}\n\ntable.dataframe th.bottomBorder {\n    border-bottom-color: var(--bold-border-color);\n}\n\ntable.dataframe tbody &gt; tr:nth-child(odd) {\n    background: var(--background-odd);\n}\n\ntable.dataframe tbody &gt; tr:nth-child(even) {\n    background: var(--background);\n}\n\ntable.dataframe tbody &gt; tr:hover {\n    background: var(--background-hover);\n}\n\ntable.dataframe a {\n    cursor: pointer;\n    color: var(--link-color);\n    text-decoration: none;\n}\n\ntable.dataframe tr:hover &gt; td a {\n    color: var(--link-color-pale);\n}\n\ntable.dataframe a:hover {\n    color: var(--link-hover);\n    text-decoration: underline;\n}\n\ntable.dataframe img {\n    max-width: fit-content;\n}\n\ntable.dataframe th.complex {\n    background-color: var(--background);\n    border: 1px solid var(--background);\n}\n\ntable.dataframe .leftBorder {\n    border-left-color: var(--inner-border-color);\n}\n\ntable.dataframe .rightBorder {\n    border-right-color: var(--inner-border-color);\n}\n\ntable.dataframe .rightAlign {\n    text-align: right;\n}\n\ntable.dataframe .expanderSvg {\n    width: 8px;\n    height: 8px;\n    margin-right: 3px;\n}\n\ntable.dataframe .expander {\n    display: flex;\n    align-items: center;\n}\n\n&sol;* formatting *&sol;\n\ntable.dataframe .null {\n    color: var(--text-color-pale);\n}\n\ntable.dataframe .structural {\n    color: var(--text-color-medium);\n    font-weight: bold;\n}\n\ntable.dataframe .dataFrameCaption {\n    font-weight: bold;\n}\n\ntable.dataframe .numbers {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe td:hover .formatted .structural, .null {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe tr:hover .formatted .structural, .null {\n    color: var(--text-color-dark);\n}\n\n\n\n\n:root {\n    --scroll-bg: #f5f5f5;\n    --scroll-fg: #b3b3b3;\n}\n:root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n    --scroll-bg: #3c3c3c;\n    --scroll-fg: #97e1fb;\n}\nbody {\n    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n}\nbody::-webkit-scrollbar {\n    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n}\nbody::-webkit-scrollbar-thumb {\n    background-color: var(--scroll-fg);\n}\nbody::-webkit-scrollbar-track {\n    background-color: var(--scroll-bg);\n}\n            &lt;&sol;style&gt;\n        &lt;&sol;head&gt;\n        &lt;body&gt;\n            \n&lt;table class=&quot;dataframe&quot; id=&quot;df_1996488704&quot;&gt;&lt;&sol;table&gt;\n\n&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 1, columnsCount = 2&lt;&sol;p&gt;\n\n        &lt;&sol;body&gt;\n        &lt;script&gt;\n            (function () {\n    window.DataFrame = window.DataFrame || new (function () {\n        this.addTable = function (df) {\n            let cols = df.cols;\n            for (let i = 0; i &lt; cols.length; i++) {\n                for (let c of cols[i].children) {\n                    cols[c].parent = i;\n                }\n            }\n            df.nrow = 0\n            for (let i = 0; i &lt; df.cols.length; i++) {\n                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n            }\n            if (df.id === df.rootId) {\n                df.expandedFrames = new Set()\n                df.childFrames = {}\n                const table = this.getTableElement(df.id)\n                table.df = df\n                for (let i = 0; i &lt; df.cols.length; i++) {\n                    let col = df.cols[i]\n                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n                }\n            } else {\n                const rootDf = this.getTableData(df.rootId)\n                rootDf.childFrames[df.id] = df\n            }\n        }\n\n        this.computeRenderData = function (df) {\n            let result = []\n            let pos = 0\n            for (let col = 0; col &lt; df.cols.length; col++) {\n                if (df.cols[col].parent === undefined)\n                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n            }\n            for (let i = 0; i &lt; result.length; i++) {\n                let row = result[i]\n                for (let j = 0; j &lt; row.length; j++) {\n                    let cell = row[j]\n                    if (j === 0)\n                        cell.leftBd = false\n                    if (j &lt; row.length - 1) {\n                        let nextData = row[j + 1]\n                        if (nextData.leftBd) cell.rightBd = true\n                        else if (cell.rightBd) nextData.leftBd = true\n                    } else cell.rightBd = false\n                }\n            }\n            return result\n        }\n\n        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n            if (result.length === depth) {\n                const array = [];\n                if (pos &gt; 0) {\n                    let j = 0\n                    for (let i = 0; j &lt; pos; i++) {\n                        let c = result[depth - 1][i]\n                        j += c.span\n                        let copy = Object.assign({empty: true}, c)\n                        array.push(copy)\n                    }\n                }\n                result.push(array)\n            }\n            const col = cols[colId];\n            let size = 0;\n            if (col.expanded) {\n                let childPos = pos\n                for (let i = 0; i &lt; col.children.length; i++) {\n                    let child = col.children[i]\n                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n                    childPos += childSize\n                    size += childSize\n                }\n            } else {\n                for (let i = depth + 1; i &lt; result.length; i++)\n                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n                size = 1\n            }\n            let left = leftBorder\n            let right = rightBorder\n            if (size &gt; 1) {\n                left = true\n                right = true\n            }\n            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n            return size\n        }\n\n        this.getTableElement = function (id) {\n            return document.getElementById(&quot;df_&quot; + id)\n        }\n\n        this.getTableData = function (id) {\n            return this.getTableElement(id).df\n        }\n\n        this.createExpander = function (isExpanded) {\n            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n            svg.classList.add(&quot;expanderSvg&quot;)\n            let path = document.createElementNS(svgNs, &quot;path&quot;)\n            if (isExpanded) {\n                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n            } else {\n                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n            }\n            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n            svg.appendChild(path)\n            return svg\n        }\n\n        this.renderTable = function (id) {\n\n            let table = this.getTableElement(id)\n\n            if (table === null) return\n\n            table.innerHTML = &quot;&quot;\n\n            let df = table.df\n            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n\n            &sol;&sol; header\n            let header = document.createElement(&quot;thead&quot;)\n            table.appendChild(header)\n\n            let renderData = this.computeRenderData(df)\n            for (let j = 0; j &lt; renderData.length; j++) {\n                let rowData = renderData[j]\n                let tr = document.createElement(&quot;tr&quot;);\n                let isLastRow = j === renderData.length - 1\n                header.appendChild(tr);\n                for (let i = 0; i &lt; rowData.length; i++) {\n                    let cell = rowData[i]\n                    let th = document.createElement(&quot;th&quot;);\n                    th.setAttribute(&quot;colspan&quot;, cell.span)\n                    let colId = cell.id\n                    let col = df.cols[colId];\n                    if (!cell.empty) {\n                        if (col.children.length === 0) {\n                            th.innerHTML = col.name\n                        } else {\n                            let link = document.createElement(&quot;a&quot;)\n                            link.className = &quot;expander&quot;\n                            let that = this\n                            link.onclick = function () {\n                                col.expanded = !col.expanded\n                                that.renderTable(id)\n                            }\n                            link.appendChild(this.createExpander(col.expanded))\n                            link.innerHTML += col.name\n                            th.appendChild(link)\n                        }\n                    }\n                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n                    if (col.rightAlign)\n                        classes += &quot; rightAlign&quot;\n                    if (isLastRow)\n                        classes += &quot; bottomBorder&quot;\n                    if (classes.length &gt; 0)\n                        th.setAttribute(&quot;class&quot;, classes)\n                    tr.appendChild(th)\n                }\n            }\n\n            &sol;&sol; body\n            let body = document.createElement(&quot;tbody&quot;)\n            table.appendChild(body)\n\n            let columns = renderData.pop()\n            for (let row = 0; row &lt; df.nrow; row++) {\n                let tr = document.createElement(&quot;tr&quot;);\n                body.appendChild(tr)\n                for (let i = 0; i &lt; columns.length; i++) {\n                    let cell = columns[i]\n                    let td = document.createElement(&quot;td&quot;);\n                    let colId = cell.id\n                    let col = df.cols[colId]\n                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n                    if (col.rightAlign)\n                        classes += &quot; rightAlign&quot;\n                    if (classes.length &gt; 0)\n                        td.setAttribute(&quot;class&quot;, classes)\n                    tr.appendChild(td)\n                    let value = col.values[row]\n                    if (value.frameId !== undefined) {\n                        let frameId = value.frameId\n                        let expanded = rootDf.expandedFrames.has(frameId)\n                        let link = document.createElement(&quot;a&quot;)\n                        link.className = &quot;expander&quot;\n                        let that = this\n                        link.onclick = function () {\n                            if (rootDf.expandedFrames.has(frameId))\n                                rootDf.expandedFrames.delete(frameId)\n                            else rootDf.expandedFrames.add(frameId)\n                            that.renderTable(id)\n                        }\n                        link.appendChild(this.createExpander(expanded))\n                        link.innerHTML += value.value\n                        if (expanded) {\n                            td.appendChild(link)\n                            td.appendChild(document.createElement(&quot;p&quot;))\n                            const childTable = document.createElement(&quot;table&quot;)\n                            childTable.className = &quot;dataframe&quot;\n                            childTable.id = &quot;df_&quot; + frameId\n                            let childDf = rootDf.childFrames[frameId]\n                            childTable.df = childDf\n                            td.appendChild(childTable)\n                            this.renderTable(frameId)\n                            if (childDf.nrow !== childDf.totalRows) {\n                                const footer = document.createElement(&quot;p&quot;)\n                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n                                td.appendChild(footer)\n                            }\n                        } else {\n                            td.appendChild(link)\n                        }\n                    } else if (value.style !== undefined) {\n                        td.innerHTML = value.value\n                        td.setAttribute(&quot;style&quot;, value.style)\n                    } else td.innerHTML = value\n                    this.nodeScriptReplace(td)\n                }\n            }\n        }\n\n        this.nodeScriptReplace = function (node) {\n            if (this.nodeScriptIs(node) === true) {\n                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n            } else {\n                let i = -1, children = node.childNodes;\n                while (++i &lt; children.length) {\n                    this.nodeScriptReplace(children[i]);\n                }\n            }\n\n            return node;\n        }\n\n        this.nodeScriptClone = function (node) {\n            let script = document.createElement(&quot;script&quot;);\n            script.text = node.innerHTML;\n\n            let i = -1, attrs = node.attributes, attr;\n            while (++i &lt; attrs.length) {\n                script.setAttribute((attr = attrs[i]).name, attr.value);\n            }\n            return script;\n        }\n\n        this.nodeScriptIs = function (node) {\n            return node.tagName === 'SCRIPT';\n        }\n    })()\n\n    window.call_DataFrame = function (f) {\n        return f();\n    };\n\n    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n    if (funQueue) {\n        funQueue.forEach(function (f) {\n            f();\n        });\n        funQueue = [];\n    }\n})()\n\n&sol;*&lt;!--*&sol;\ncall_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;firstName: String&bsol;&quot;&gt;firstName&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;Bob&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;lastName: String&bsol;&quot;&gt;lastName&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;Brown&quot;] }, \n], id: 1996488704, rootId: 1996488704, totalRows: 1 } ) });\n&sol;*--&gt;*&sol;\n\ncall_DataFrame(function() { DataFrame.renderTable(1996488704) });\n\n\n\n        &lt;&sol;script&gt;\n        &lt;&sol;html&gt;\"></iframe>\n            <script>\n                function o_resize_iframe_out_1() {\n                    let elem = document.getElementById(\"iframe_out_1\");\n                    resize_iframe_out_1(elem);\n                    setInterval(resize_iframe_out_1, 5000, elem);\n                }\n                function resize_iframe_out_1(el) {\n                    let h = el.contentWindow.document.body.scrollHeight;\n                    el.height = h === 0 ? 0 : h + 41;\n                }\n            </script>",
      "application/kotlindataframe+json": "{\"nrow\":1,\"ncol\":2,\"columns\":[\"firstName\",\"lastName\"],\"kotlin_dataframe\":[{\"firstName\":\"Bob\",\"lastName\":\"Brown\"}]}"
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bob"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also use full syntax for defining renderers. It's verbose but let you do many things"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:04.348896900Z",
     "start_time": "2023-07-01T16:26:03.831944200Z"
    }
   },
   "outputs": [],
   "source": [
    "class User2(val name: String)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:05.346896200Z",
     "start_time": "2023-07-01T16:26:03.935910Z"
    }
   },
   "outputs": [],
   "source": [
    "USE {\n",
    "    addRenderer(object : RendererHandler {\n",
    "        override fun replaceVariables(mapping: Map<String, String>): RendererHandler {\n",
    "            return this\n",
    "        }\n",
    "\n",
    "        override val execution: ResultHandlerExecution\n",
    "            get() = ResultHandlerExecution { host, res ->\n",
    "                FieldValue(\"Value of ${res.name} is a user with name ${(res.value as User2).name}\", null)\n",
    "            }\n",
    "\n",
    "        override fun accepts(value: Any?): Boolean {\n",
    "            return value != null && value::class == User2::class\n",
    "        }\n",
    "    })\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:05.785010200Z",
     "start_time": "2023-07-01T16:26:04.733895900Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "Value of res42 is a user with name Felix"
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "User2(\"Felix\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What do the libraries bring except for dependencies and renderers? First of all, default imports.\n",
    "These imports are implicitly added to all subsequent cells."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:06.100904600Z",
     "start_time": "2023-07-01T16:26:04.905012700Z"
    }
   },
   "outputs": [],
   "source": [
    "fun loadFileFromGitHub(repositoryUrl: String, filePath: String): String {\n",
    "    val rawUrl = \"$repositoryUrl/raw/master/$filePath\"\n",
    "    val url = URL(rawUrl)\n",
    "    val connection = url.openConnection()\n",
    "    connection.setRequestProperty(\"Accept\", \"application/vnd.github.v3.raw\")\n",
    "\n",
    "    val inputStream = connection.getInputStream()\n",
    "    val content = inputStream.bufferedReader().use { it.readText() }\n",
    "\n",
    "    return content\n",
    "}\n",
    "\n",
    "fun loadDescriptor(name: String) {\n",
    "    val text = loadFileFromGitHub(\"https://github.com/Kotlin/kotlin-jupyter-libraries\", \"$name.json\")\n",
    "    DISPLAY(MIME(\n",
    "        \"text/markdown\" to \"```json\\n$text```\"\n",
    "    ))\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice `imports` section in the following descriptor:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:06.711895700Z",
     "start_time": "2023-07-01T16:26:05.632909600Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/markdown": "```json\n{\n  \"link\": \"https://github.com/breandan/kaliningraph\",\n  \"description\": \"Graph library with a DSL for constructing graphs and visualizing the behavior of graph algorithms\",\n  \"dependencies\": [\n    \"com.github.breandan:kaliningraph:0.1.4\"\n  ],\n  \"imports\": [\n    \"edu.mcgill.kaliningraph.*\",\n    \"edu.mcgill.kaliningraph.matrix.*\",\n    \"edu.mcgill.kaliningraph.circuits.*\",\n    \"org.ejml.data.*\",\n    \"org.ejml.kotlin.*\"\n  ],\n  \"renderers\": {\n    \"edu.mcgill.kaliningraph.LabeledGraph\": \"HTML(($it as edu.mcgill.kaliningraph.Graph<*, *, *>).html())\",\n    \"edu.mcgill.kaliningraph.circuits.Gate\": \"HTML(($it as edu.mcgill.kaliningraph.circuits.Gate).graph.html())\",\n    \"edu.mcgill.kaliningraph.circuits.NFunction\": \"HTML(($it as edu.mcgill.kaliningraph.circuits.NFunction).graph.html())\",\n    \"edu.mcgill.kaliningraph.circuits.ComputationGraph\": \"HTML(($it as edu.mcgill.kaliningraph.Graph<*, *, *>).html())\",\n    \"edu.mcgill.kaliningraph.matrix.BMat\": \"HTML(\\\"<img src=\\\\\\\"${($it as edu.mcgill.kaliningraph.matrix.BMat).matToImg()}\\\\\\\"/>\\\")\",\n    \"edu.mcgill.kaliningraph.matrix.BSqMat\": \"HTML(\\\"<img src=\\\\\\\"${($it as edu.mcgill.kaliningraph.matrix.BSqMat).matToImg()}\\\\\\\"/>\\\")\"\n  }\n}\n```"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {}
    }
   ],
   "source": [
    "loadDescriptor(\"kaliningraph\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You might have noticed that almost every descriptor in `Kotlin/kotlin-jupyter-libraries` contains link and description.\n",
    "They are used to build `:help` command output and [our README](https://github.com/Kotlin/kotlin-jupyter#list-of-supported-libraries)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Creating an integration"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, we learned the concept of the integration. It is a wrapper on top of the usual Kotlin library that simplifies and elevates the experience of using this library in the notebook.\n",
    "Comprehensive guide to writing library integrations can be found [here](). To inspire you, there is an example of the `dataframe` integration below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:14.046897300Z",
     "start_time": "2023-07-01T16:26:06.491895300Z"
    }
   },
   "outputs": [],
   "source": [
    "%use dataframe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:16.898989Z",
     "start_time": "2023-07-01T16:26:14.024900100Z"
    }
   },
   "outputs": [],
   "source": [
    "val df = DataFrame.read(\"https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's try to investigate the data that we have just read."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:17.314907100Z",
     "start_time": "2023-07-01T16:26:16.825895800Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": "            <iframe onload=\"o_resize_iframe_out_2()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_2\" frameBorder=\"0\" srcdoc=\"        &lt;html&gt;\n        &lt;head&gt;\n            &lt;style type=&quot;text&sol;css&quot;&gt;\n                :root {\n    --background: #fff;\n    --background-odd: #f5f5f5;\n    --background-hover: #d9edfd;\n    --header-text-color: #474747;\n    --text-color: #848484;\n    --text-color-dark: #000;\n    --text-color-medium: #737373;\n    --text-color-pale: #b3b3b3;\n    --inner-border-color: #aaa;\n    --bold-border-color: #000;\n    --link-color: #296eaa;\n    --link-color-pale: #296eaa;\n    --link-hover: #1a466c;\n}\n\n:root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n    --background: #303030;\n    --background-odd: #3c3c3c;\n    --background-hover: #464646;\n    --header-text-color: #dddddd;\n    --text-color: #b3b3b3;\n    --text-color-dark: #dddddd;\n    --text-color-medium: #b2b2b2;\n    --text-color-pale: #737373;\n    --inner-border-color: #707070;\n    --bold-border-color: #777777;\n    --link-color: #008dc0;\n    --link-color-pale: #97e1fb;\n    --link-hover: #00688e;\n}\n\np.dataframe_description {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe {\n    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n    font-size: 12px;\n    background-color: var(--background);\n    color: var(--text-color-dark);\n    border: none;\n    border-collapse: collapse;\n}\n\ntable.dataframe th, td {\n    padding: 6px;\n    border: 1px solid transparent;\n    text-align: left;\n}\n\ntable.dataframe th {\n    background-color: var(--background);\n    color: var(--header-text-color);\n}\n\ntable.dataframe td {\n    vertical-align: top;\n}\n\ntable.dataframe th.bottomBorder {\n    border-bottom-color: var(--bold-border-color);\n}\n\ntable.dataframe tbody &gt; tr:nth-child(odd) {\n    background: var(--background-odd);\n}\n\ntable.dataframe tbody &gt; tr:nth-child(even) {\n    background: var(--background);\n}\n\ntable.dataframe tbody &gt; tr:hover {\n    background: var(--background-hover);\n}\n\ntable.dataframe a {\n    cursor: pointer;\n    color: var(--link-color);\n    text-decoration: none;\n}\n\ntable.dataframe tr:hover &gt; td a {\n    color: var(--link-color-pale);\n}\n\ntable.dataframe a:hover {\n    color: var(--link-hover);\n    text-decoration: underline;\n}\n\ntable.dataframe img {\n    max-width: fit-content;\n}\n\ntable.dataframe th.complex {\n    background-color: var(--background);\n    border: 1px solid var(--background);\n}\n\ntable.dataframe .leftBorder {\n    border-left-color: var(--inner-border-color);\n}\n\ntable.dataframe .rightBorder {\n    border-right-color: var(--inner-border-color);\n}\n\ntable.dataframe .rightAlign {\n    text-align: right;\n}\n\ntable.dataframe .expanderSvg {\n    width: 8px;\n    height: 8px;\n    margin-right: 3px;\n}\n\ntable.dataframe .expander {\n    display: flex;\n    align-items: center;\n}\n\n&sol;* formatting *&sol;\n\ntable.dataframe .null {\n    color: var(--text-color-pale);\n}\n\ntable.dataframe .structural {\n    color: var(--text-color-medium);\n    font-weight: bold;\n}\n\ntable.dataframe .dataFrameCaption {\n    font-weight: bold;\n}\n\ntable.dataframe .numbers {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe td:hover .formatted .structural, .null {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe tr:hover .formatted .structural, .null {\n    color: var(--text-color-dark);\n}\n\n\n\n\n:root {\n    --scroll-bg: #f5f5f5;\n    --scroll-fg: #b3b3b3;\n}\n:root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n    --scroll-bg: #3c3c3c;\n    --scroll-fg: #97e1fb;\n}\nbody {\n    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n}\nbody::-webkit-scrollbar {\n    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n}\nbody::-webkit-scrollbar-thumb {\n    background-color: var(--scroll-fg);\n}\nbody::-webkit-scrollbar-track {\n    background-color: var(--scroll-bg);\n}\n            &lt;&sol;style&gt;\n        &lt;&sol;head&gt;\n        &lt;body&gt;\n            \n&lt;table class=&quot;dataframe&quot; id=&quot;df_1996488705&quot;&gt;&lt;&sol;table&gt;\n\n&lt;p class=&quot;dataframe_description&quot;&gt;... showing only top 20 of 150 rows&lt;&sol;p&gt;&lt;p class=&quot;dataframe_description&quot;&gt;DataColumn: name = &quot;petal_length&quot;, type = Double, size = 150&lt;&sol;p&gt;\n\n        &lt;&sol;body&gt;\n        &lt;script&gt;\n            (function () {\n    window.DataFrame = window.DataFrame || new (function () {\n        this.addTable = function (df) {\n            let cols = df.cols;\n            for (let i = 0; i &lt; cols.length; i++) {\n                for (let c of cols[i].children) {\n                    cols[c].parent = i;\n                }\n            }\n            df.nrow = 0\n            for (let i = 0; i &lt; df.cols.length; i++) {\n                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n            }\n            if (df.id === df.rootId) {\n                df.expandedFrames = new Set()\n                df.childFrames = {}\n                const table = this.getTableElement(df.id)\n                table.df = df\n                for (let i = 0; i &lt; df.cols.length; i++) {\n                    let col = df.cols[i]\n                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n                }\n            } else {\n                const rootDf = this.getTableData(df.rootId)\n                rootDf.childFrames[df.id] = df\n            }\n        }\n\n        this.computeRenderData = function (df) {\n            let result = []\n            let pos = 0\n            for (let col = 0; col &lt; df.cols.length; col++) {\n                if (df.cols[col].parent === undefined)\n                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n            }\n            for (let i = 0; i &lt; result.length; i++) {\n                let row = result[i]\n                for (let j = 0; j &lt; row.length; j++) {\n                    let cell = row[j]\n                    if (j === 0)\n                        cell.leftBd = false\n                    if (j &lt; row.length - 1) {\n                        let nextData = row[j + 1]\n                        if (nextData.leftBd) cell.rightBd = true\n                        else if (cell.rightBd) nextData.leftBd = true\n                    } else cell.rightBd = false\n                }\n            }\n            return result\n        }\n\n        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n            if (result.length === depth) {\n                const array = [];\n                if (pos &gt; 0) {\n                    let j = 0\n                    for (let i = 0; j &lt; pos; i++) {\n                        let c = result[depth - 1][i]\n                        j += c.span\n                        let copy = Object.assign({empty: true}, c)\n                        array.push(copy)\n                    }\n                }\n                result.push(array)\n            }\n            const col = cols[colId];\n            let size = 0;\n            if (col.expanded) {\n                let childPos = pos\n                for (let i = 0; i &lt; col.children.length; i++) {\n                    let child = col.children[i]\n                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n                    childPos += childSize\n                    size += childSize\n                }\n            } else {\n                for (let i = depth + 1; i &lt; result.length; i++)\n                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n                size = 1\n            }\n            let left = leftBorder\n            let right = rightBorder\n            if (size &gt; 1) {\n                left = true\n                right = true\n            }\n            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n            return size\n        }\n\n        this.getTableElement = function (id) {\n            return document.getElementById(&quot;df_&quot; + id)\n        }\n\n        this.getTableData = function (id) {\n            return this.getTableElement(id).df\n        }\n\n        this.createExpander = function (isExpanded) {\n            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n            svg.classList.add(&quot;expanderSvg&quot;)\n            let path = document.createElementNS(svgNs, &quot;path&quot;)\n            if (isExpanded) {\n                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n            } else {\n                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n            }\n            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n            svg.appendChild(path)\n            return svg\n        }\n\n        this.renderTable = function (id) {\n\n            let table = this.getTableElement(id)\n\n            if (table === null) return\n\n            table.innerHTML = &quot;&quot;\n\n            let df = table.df\n            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n\n            &sol;&sol; header\n            let header = document.createElement(&quot;thead&quot;)\n            table.appendChild(header)\n\n            let renderData = this.computeRenderData(df)\n            for (let j = 0; j &lt; renderData.length; j++) {\n                let rowData = renderData[j]\n                let tr = document.createElement(&quot;tr&quot;);\n                let isLastRow = j === renderData.length - 1\n                header.appendChild(tr);\n                for (let i = 0; i &lt; rowData.length; i++) {\n                    let cell = rowData[i]\n                    let th = document.createElement(&quot;th&quot;);\n                    th.setAttribute(&quot;colspan&quot;, cell.span)\n                    let colId = cell.id\n                    let col = df.cols[colId];\n                    if (!cell.empty) {\n                        if (col.children.length === 0) {\n                            th.innerHTML = col.name\n                        } else {\n                            let link = document.createElement(&quot;a&quot;)\n                            link.className = &quot;expander&quot;\n                            let that = this\n                            link.onclick = function () {\n                                col.expanded = !col.expanded\n                                that.renderTable(id)\n                            }\n                            link.appendChild(this.createExpander(col.expanded))\n                            link.innerHTML += col.name\n                            th.appendChild(link)\n                        }\n                    }\n                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n                    if (col.rightAlign)\n                        classes += &quot; rightAlign&quot;\n                    if (isLastRow)\n                        classes += &quot; bottomBorder&quot;\n                    if (classes.length &gt; 0)\n                        th.setAttribute(&quot;class&quot;, classes)\n                    tr.appendChild(th)\n                }\n            }\n\n            &sol;&sol; body\n            let body = document.createElement(&quot;tbody&quot;)\n            table.appendChild(body)\n\n            let columns = renderData.pop()\n            for (let row = 0; row &lt; df.nrow; row++) {\n                let tr = document.createElement(&quot;tr&quot;);\n                body.appendChild(tr)\n                for (let i = 0; i &lt; columns.length; i++) {\n                    let cell = columns[i]\n                    let td = document.createElement(&quot;td&quot;);\n                    let colId = cell.id\n                    let col = df.cols[colId]\n                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n                    if (col.rightAlign)\n                        classes += &quot; rightAlign&quot;\n                    if (classes.length &gt; 0)\n                        td.setAttribute(&quot;class&quot;, classes)\n                    tr.appendChild(td)\n                    let value = col.values[row]\n                    if (value.frameId !== undefined) {\n                        let frameId = value.frameId\n                        let expanded = rootDf.expandedFrames.has(frameId)\n                        let link = document.createElement(&quot;a&quot;)\n                        link.className = &quot;expander&quot;\n                        let that = this\n                        link.onclick = function () {\n                            if (rootDf.expandedFrames.has(frameId))\n                                rootDf.expandedFrames.delete(frameId)\n                            else rootDf.expandedFrames.add(frameId)\n                            that.renderTable(id)\n                        }\n                        link.appendChild(this.createExpander(expanded))\n                        link.innerHTML += value.value\n                        if (expanded) {\n                            td.appendChild(link)\n                            td.appendChild(document.createElement(&quot;p&quot;))\n                            const childTable = document.createElement(&quot;table&quot;)\n                            childTable.className = &quot;dataframe&quot;\n                            childTable.id = &quot;df_&quot; + frameId\n                            let childDf = rootDf.childFrames[frameId]\n                            childTable.df = childDf\n                            td.appendChild(childTable)\n                            this.renderTable(frameId)\n                            if (childDf.nrow !== childDf.totalRows) {\n                                const footer = document.createElement(&quot;p&quot;)\n                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n                                td.appendChild(footer)\n                            }\n                        } else {\n                            td.appendChild(link)\n                        }\n                    } else if (value.style !== undefined) {\n                        td.innerHTML = value.value\n                        td.setAttribute(&quot;style&quot;, value.style)\n                    } else td.innerHTML = value\n                    this.nodeScriptReplace(td)\n                }\n            }\n        }\n\n        this.nodeScriptReplace = function (node) {\n            if (this.nodeScriptIs(node) === true) {\n                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n            } else {\n                let i = -1, children = node.childNodes;\n                while (++i &lt; children.length) {\n                    this.nodeScriptReplace(children[i]);\n                }\n            }\n\n            return node;\n        }\n\n        this.nodeScriptClone = function (node) {\n            let script = document.createElement(&quot;script&quot;);\n            script.text = node.innerHTML;\n\n            let i = -1, attrs = node.attributes, attr;\n            while (++i &lt; attrs.length) {\n                script.setAttribute((attr = attrs[i]).name, attr.value);\n            }\n            return script;\n        }\n\n        this.nodeScriptIs = function (node) {\n            return node.tagName === 'SCRIPT';\n        }\n    })()\n\n    window.call_DataFrame = function (f) {\n        return f();\n    };\n\n    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n    if (funQueue) {\n        funQueue.forEach(function (f) {\n            f();\n        });\n        funQueue = [];\n    }\n})()\n\n&sol;*&lt;!--*&sol;\ncall_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;petal_length: Double&bsol;&quot;&gt;petal_length&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,3&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,7&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,6&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,1&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,3&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,7&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n], id: 1996488705, rootId: 1996488705, totalRows: 150 } ) });\n&sol;*--&gt;*&sol;\n\ncall_DataFrame(function() { DataFrame.renderTable(1996488705) });\n\n\n\n        &lt;&sol;script&gt;\n        &lt;&sol;html&gt;\"></iframe>\n            <script>\n                function o_resize_iframe_out_2() {\n                    let elem = document.getElementById(\"iframe_out_2\");\n                    resize_iframe_out_2(elem);\n                    setInterval(resize_iframe_out_2, 5000, elem);\n                }\n                function resize_iframe_out_2(el) {\n                    let h = el.contentWindow.document.body.scrollHeight;\n                    el.height = h === 0 ? 0 : h + 41;\n                }\n            </script>",
      "application/kotlindataframe+json": "{\"nrow\":150,\"ncol\":1,\"columns\":[\"petal_length\"],\"kotlin_dataframe\":[{\"petal_length\":1.4},{\"petal_length\":1.4},{\"petal_length\":1.3},{\"petal_length\":1.5},{\"petal_length\":1.4},{\"petal_length\":1.7},{\"petal_length\":1.4},{\"petal_length\":1.5},{\"petal_length\":1.4},{\"petal_length\":1.5},{\"petal_length\":1.5},{\"petal_length\":1.6},{\"petal_length\":1.4},{\"petal_length\":1.1},{\"petal_length\":1.2},{\"petal_length\":1.5},{\"petal_length\":1.3},{\"petal_length\":1.4},{\"petal_length\":1.7},{\"petal_length\":1.5}]}"
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.petal_length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:19.919905400Z",
     "start_time": "2023-07-01T16:26:17.097895900Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": "            <iframe onload=\"o_resize_iframe_out_3()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_3\" frameBorder=\"0\" srcdoc=\"        &lt;html&gt;\n        &lt;head&gt;\n            &lt;style type=&quot;text&sol;css&quot;&gt;\n                :root {\n    --background: #fff;\n    --background-odd: #f5f5f5;\n    --background-hover: #d9edfd;\n    --header-text-color: #474747;\n    --text-color: #848484;\n    --text-color-dark: #000;\n    --text-color-medium: #737373;\n    --text-color-pale: #b3b3b3;\n    --inner-border-color: #aaa;\n    --bold-border-color: #000;\n    --link-color: #296eaa;\n    --link-color-pale: #296eaa;\n    --link-hover: #1a466c;\n}\n\n:root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n    --background: #303030;\n    --background-odd: #3c3c3c;\n    --background-hover: #464646;\n    --header-text-color: #dddddd;\n    --text-color: #b3b3b3;\n    --text-color-dark: #dddddd;\n    --text-color-medium: #b2b2b2;\n    --text-color-pale: #737373;\n    --inner-border-color: #707070;\n    --bold-border-color: #777777;\n    --link-color: #008dc0;\n    --link-color-pale: #97e1fb;\n    --link-hover: #00688e;\n}\n\np.dataframe_description {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe {\n    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n    font-size: 12px;\n    background-color: var(--background);\n    color: var(--text-color-dark);\n    border: none;\n    border-collapse: collapse;\n}\n\ntable.dataframe th, td {\n    padding: 6px;\n    border: 1px solid transparent;\n    text-align: left;\n}\n\ntable.dataframe th {\n    background-color: var(--background);\n    color: var(--header-text-color);\n}\n\ntable.dataframe td {\n    vertical-align: top;\n}\n\ntable.dataframe th.bottomBorder {\n    border-bottom-color: var(--bold-border-color);\n}\n\ntable.dataframe tbody &gt; tr:nth-child(odd) {\n    background: var(--background-odd);\n}\n\ntable.dataframe tbody &gt; tr:nth-child(even) {\n    background: var(--background);\n}\n\ntable.dataframe tbody &gt; tr:hover {\n    background: var(--background-hover);\n}\n\ntable.dataframe a {\n    cursor: pointer;\n    color: var(--link-color);\n    text-decoration: none;\n}\n\ntable.dataframe tr:hover &gt; td a {\n    color: var(--link-color-pale);\n}\n\ntable.dataframe a:hover {\n    color: var(--link-hover);\n    text-decoration: underline;\n}\n\ntable.dataframe img {\n    max-width: fit-content;\n}\n\ntable.dataframe th.complex {\n    background-color: var(--background);\n    border: 1px solid var(--background);\n}\n\ntable.dataframe .leftBorder {\n    border-left-color: var(--inner-border-color);\n}\n\ntable.dataframe .rightBorder {\n    border-right-color: var(--inner-border-color);\n}\n\ntable.dataframe .rightAlign {\n    text-align: right;\n}\n\ntable.dataframe .expanderSvg {\n    width: 8px;\n    height: 8px;\n    margin-right: 3px;\n}\n\ntable.dataframe .expander {\n    display: flex;\n    align-items: center;\n}\n\n&sol;* formatting *&sol;\n\ntable.dataframe .null {\n    color: var(--text-color-pale);\n}\n\ntable.dataframe .structural {\n    color: var(--text-color-medium);\n    font-weight: bold;\n}\n\ntable.dataframe .dataFrameCaption {\n    font-weight: bold;\n}\n\ntable.dataframe .numbers {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe td:hover .formatted .structural, .null {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe tr:hover .formatted .structural, .null {\n    color: var(--text-color-dark);\n}\n\n\n\n\n:root {\n    --scroll-bg: #f5f5f5;\n    --scroll-fg: #b3b3b3;\n}\n:root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n    --scroll-bg: #3c3c3c;\n    --scroll-fg: #97e1fb;\n}\nbody {\n    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n}\nbody::-webkit-scrollbar {\n    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n}\nbody::-webkit-scrollbar-thumb {\n    background-color: var(--scroll-fg);\n}\nbody::-webkit-scrollbar-track {\n    background-color: var(--scroll-bg);\n}\n            &lt;&sol;style&gt;\n        &lt;&sol;head&gt;\n        &lt;body&gt;\n            \n&lt;table class=&quot;dataframe&quot; id=&quot;df_1996488706&quot;&gt;&lt;&sol;table&gt;\n\n&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 1, columnsCount = 5&lt;&sol;p&gt;\n\n        &lt;&sol;body&gt;\n        &lt;script&gt;\n            (function () {\n    window.DataFrame = window.DataFrame || new (function () {\n        this.addTable = function (df) {\n            let cols = df.cols;\n            for (let i = 0; i &lt; cols.length; i++) {\n                for (let c of cols[i].children) {\n                    cols[c].parent = i;\n                }\n            }\n            df.nrow = 0\n            for (let i = 0; i &lt; df.cols.length; i++) {\n                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n            }\n            if (df.id === df.rootId) {\n                df.expandedFrames = new Set()\n                df.childFrames = {}\n                const table = this.getTableElement(df.id)\n                table.df = df\n                for (let i = 0; i &lt; df.cols.length; i++) {\n                    let col = df.cols[i]\n                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n                }\n            } else {\n                const rootDf = this.getTableData(df.rootId)\n                rootDf.childFrames[df.id] = df\n            }\n        }\n\n        this.computeRenderData = function (df) {\n            let result = []\n            let pos = 0\n            for (let col = 0; col &lt; df.cols.length; col++) {\n                if (df.cols[col].parent === undefined)\n                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n            }\n            for (let i = 0; i &lt; result.length; i++) {\n                let row = result[i]\n                for (let j = 0; j &lt; row.length; j++) {\n                    let cell = row[j]\n                    if (j === 0)\n                        cell.leftBd = false\n                    if (j &lt; row.length - 1) {\n                        let nextData = row[j + 1]\n                        if (nextData.leftBd) cell.rightBd = true\n                        else if (cell.rightBd) nextData.leftBd = true\n                    } else cell.rightBd = false\n                }\n            }\n            return result\n        }\n\n        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n            if (result.length === depth) {\n                const array = [];\n                if (pos &gt; 0) {\n                    let j = 0\n                    for (let i = 0; j &lt; pos; i++) {\n                        let c = result[depth - 1][i]\n                        j += c.span\n                        let copy = Object.assign({empty: true}, c)\n                        array.push(copy)\n                    }\n                }\n                result.push(array)\n            }\n            const col = cols[colId];\n            let size = 0;\n            if (col.expanded) {\n                let childPos = pos\n                for (let i = 0; i &lt; col.children.length; i++) {\n                    let child = col.children[i]\n                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n                    childPos += childSize\n                    size += childSize\n                }\n            } else {\n                for (let i = depth + 1; i &lt; result.length; i++)\n                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n                size = 1\n            }\n            let left = leftBorder\n            let right = rightBorder\n            if (size &gt; 1) {\n                left = true\n                right = true\n            }\n            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n            return size\n        }\n\n        this.getTableElement = function (id) {\n            return document.getElementById(&quot;df_&quot; + id)\n        }\n\n        this.getTableData = function (id) {\n            return this.getTableElement(id).df\n        }\n\n        this.createExpander = function (isExpanded) {\n            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n            svg.classList.add(&quot;expanderSvg&quot;)\n            let path = document.createElementNS(svgNs, &quot;path&quot;)\n            if (isExpanded) {\n                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n            } else {\n                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n            }\n            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n            svg.appendChild(path)\n            return svg\n        }\n\n        this.renderTable = function (id) {\n\n            let table = this.getTableElement(id)\n\n            if (table === null) return\n\n            table.innerHTML = &quot;&quot;\n\n            let df = table.df\n            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n\n            &sol;&sol; header\n            let header = document.createElement(&quot;thead&quot;)\n            table.appendChild(header)\n\n            let renderData = this.computeRenderData(df)\n            for (let j = 0; j &lt; renderData.length; j++) {\n                let rowData = renderData[j]\n                let tr = document.createElement(&quot;tr&quot;);\n                let isLastRow = j === renderData.length - 1\n                header.appendChild(tr);\n                for (let i = 0; i &lt; rowData.length; i++) {\n                    let cell = rowData[i]\n                    let th = document.createElement(&quot;th&quot;);\n                    th.setAttribute(&quot;colspan&quot;, cell.span)\n                    let colId = cell.id\n                    let col = df.cols[colId];\n                    if (!cell.empty) {\n                        if (col.children.length === 0) {\n                            th.innerHTML = col.name\n                        } else {\n                            let link = document.createElement(&quot;a&quot;)\n                            link.className = &quot;expander&quot;\n                            let that = this\n                            link.onclick = function () {\n                                col.expanded = !col.expanded\n                                that.renderTable(id)\n                            }\n                            link.appendChild(this.createExpander(col.expanded))\n                            link.innerHTML += col.name\n                            th.appendChild(link)\n                        }\n                    }\n                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n                    if (col.rightAlign)\n                        classes += &quot; rightAlign&quot;\n                    if (isLastRow)\n                        classes += &quot; bottomBorder&quot;\n                    if (classes.length &gt; 0)\n                        th.setAttribute(&quot;class&quot;, classes)\n                    tr.appendChild(th)\n                }\n            }\n\n            &sol;&sol; body\n            let body = document.createElement(&quot;tbody&quot;)\n            table.appendChild(body)\n\n            let columns = renderData.pop()\n            for (let row = 0; row &lt; df.nrow; row++) {\n                let tr = document.createElement(&quot;tr&quot;);\n                body.appendChild(tr)\n                for (let i = 0; i &lt; columns.length; i++) {\n                    let cell = columns[i]\n                    let td = document.createElement(&quot;td&quot;);\n                    let colId = cell.id\n                    let col = df.cols[colId]\n                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n                    if (col.rightAlign)\n                        classes += &quot; rightAlign&quot;\n                    if (classes.length &gt; 0)\n                        td.setAttribute(&quot;class&quot;, classes)\n                    tr.appendChild(td)\n                    let value = col.values[row]\n                    if (value.frameId !== undefined) {\n                        let frameId = value.frameId\n                        let expanded = rootDf.expandedFrames.has(frameId)\n                        let link = document.createElement(&quot;a&quot;)\n                        link.className = &quot;expander&quot;\n                        let that = this\n                        link.onclick = function () {\n                            if (rootDf.expandedFrames.has(frameId))\n                                rootDf.expandedFrames.delete(frameId)\n                            else rootDf.expandedFrames.add(frameId)\n                            that.renderTable(id)\n                        }\n                        link.appendChild(this.createExpander(expanded))\n                        link.innerHTML += value.value\n                        if (expanded) {\n                            td.appendChild(link)\n                            td.appendChild(document.createElement(&quot;p&quot;))\n                            const childTable = document.createElement(&quot;table&quot;)\n                            childTable.className = &quot;dataframe&quot;\n                            childTable.id = &quot;df_&quot; + frameId\n                            let childDf = rootDf.childFrames[frameId]\n                            childTable.df = childDf\n                            td.appendChild(childTable)\n                            this.renderTable(frameId)\n                            if (childDf.nrow !== childDf.totalRows) {\n                                const footer = document.createElement(&quot;p&quot;)\n                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n                                td.appendChild(footer)\n                            }\n                        } else {\n                            td.appendChild(link)\n                        }\n                    } else if (value.style !== undefined) {\n                        td.innerHTML = value.value\n                        td.setAttribute(&quot;style&quot;, value.style)\n                    } else td.innerHTML = value\n                    this.nodeScriptReplace(td)\n                }\n            }\n        }\n\n        this.nodeScriptReplace = function (node) {\n            if (this.nodeScriptIs(node) === true) {\n                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n            } else {\n                let i = -1, children = node.childNodes;\n                while (++i &lt; children.length) {\n                    this.nodeScriptReplace(children[i]);\n                }\n            }\n\n            return node;\n        }\n\n        this.nodeScriptClone = function (node) {\n            let script = document.createElement(&quot;script&quot;);\n            script.text = node.innerHTML;\n\n            let i = -1, attrs = node.attributes, attr;\n            while (++i &lt; attrs.length) {\n                script.setAttribute((attr = attrs[i]).name, attr.value);\n            }\n            return script;\n        }\n\n        this.nodeScriptIs = function (node) {\n            return node.tagName === 'SCRIPT';\n        }\n    })()\n\n    window.call_DataFrame = function (f) {\n        return f();\n    };\n\n    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n    if (funQueue) {\n        funQueue.forEach(function (f) {\n            f();\n        });\n        funQueue = [];\n    }\n})()\n\n&sol;*&lt;!--*&sol;\ncall_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;sepal_length: Double&bsol;&quot;&gt;sepal_length&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;5,9&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;sepal_width: Double&bsol;&quot;&gt;sepal_width&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;3,0&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;petal_length: Double&bsol;&quot;&gt;petal_length&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;4,2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;petal_width: Double&bsol;&quot;&gt;petal_width&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;species: String&bsol;&quot;&gt;species&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;versicolor&quot;] }, \n], id: 1996488706, rootId: 1996488706, totalRows: 1 } ) });\n&sol;*--&gt;*&sol;\n\ncall_DataFrame(function() { DataFrame.renderTable(1996488706) });\n\n\n\n        &lt;&sol;script&gt;\n        &lt;&sol;html&gt;\"></iframe>\n            <script>\n                function o_resize_iframe_out_3() {\n                    let elem = document.getElementById(\"iframe_out_3\");\n                    resize_iframe_out_3(elem);\n                    setInterval(resize_iframe_out_3, 5000, elem);\n                }\n                function resize_iframe_out_3(el) {\n                    let h = el.contentWindow.document.body.scrollHeight;\n                    el.height = h === 0 ? 0 : h + 41;\n                }\n            </script>",
      "application/kotlindataframe+json": "{\"nrow\":1,\"ncol\":5,\"columns\":[\"sepal_length\",\"sepal_width\",\"petal_length\",\"petal_width\",\"species\"],\"kotlin_dataframe\":[{\"sepal_length\":5.9,\"sepal_width\":3.0,\"petal_length\":4.2,\"petal_width\":1.5,\"species\":\"versicolor\"}]}"
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.filter { petal_width >= 1.5 && petal_length < 4.5 }"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There is also a special variable in the integration to manage display options. For example, we can limit number of displayed rows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:20.048901400Z",
     "start_time": "2023-07-01T16:26:17.569046600Z"
    }
   },
   "outputs": [],
   "source": [
    "dataFrameConfig.display.rowsLimit = 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:20.813895800Z",
     "start_time": "2023-07-01T16:26:17.765896100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": "            <iframe onload=\"o_resize_iframe_out_4()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_4\" frameBorder=\"0\" srcdoc=\"        &lt;html&gt;\n        &lt;head&gt;\n            &lt;style type=&quot;text&sol;css&quot;&gt;\n                :root {\n    --background: #fff;\n    --background-odd: #f5f5f5;\n    --background-hover: #d9edfd;\n    --header-text-color: #474747;\n    --text-color: #848484;\n    --text-color-dark: #000;\n    --text-color-medium: #737373;\n    --text-color-pale: #b3b3b3;\n    --inner-border-color: #aaa;\n    --bold-border-color: #000;\n    --link-color: #296eaa;\n    --link-color-pale: #296eaa;\n    --link-hover: #1a466c;\n}\n\n:root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;], .dataframe_dark{\n    --background: #303030;\n    --background-odd: #3c3c3c;\n    --background-hover: #464646;\n    --header-text-color: #dddddd;\n    --text-color: #b3b3b3;\n    --text-color-dark: #dddddd;\n    --text-color-medium: #b2b2b2;\n    --text-color-pale: #737373;\n    --inner-border-color: #707070;\n    --bold-border-color: #777777;\n    --link-color: #008dc0;\n    --link-color-pale: #97e1fb;\n    --link-hover: #00688e;\n}\n\np.dataframe_description {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe {\n    font-family: &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;\n    font-size: 12px;\n    background-color: var(--background);\n    color: var(--text-color-dark);\n    border: none;\n    border-collapse: collapse;\n}\n\ntable.dataframe th, td {\n    padding: 6px;\n    border: 1px solid transparent;\n    text-align: left;\n}\n\ntable.dataframe th {\n    background-color: var(--background);\n    color: var(--header-text-color);\n}\n\ntable.dataframe td {\n    vertical-align: top;\n}\n\ntable.dataframe th.bottomBorder {\n    border-bottom-color: var(--bold-border-color);\n}\n\ntable.dataframe tbody &gt; tr:nth-child(odd) {\n    background: var(--background-odd);\n}\n\ntable.dataframe tbody &gt; tr:nth-child(even) {\n    background: var(--background);\n}\n\ntable.dataframe tbody &gt; tr:hover {\n    background: var(--background-hover);\n}\n\ntable.dataframe a {\n    cursor: pointer;\n    color: var(--link-color);\n    text-decoration: none;\n}\n\ntable.dataframe tr:hover &gt; td a {\n    color: var(--link-color-pale);\n}\n\ntable.dataframe a:hover {\n    color: var(--link-hover);\n    text-decoration: underline;\n}\n\ntable.dataframe img {\n    max-width: fit-content;\n}\n\ntable.dataframe th.complex {\n    background-color: var(--background);\n    border: 1px solid var(--background);\n}\n\ntable.dataframe .leftBorder {\n    border-left-color: var(--inner-border-color);\n}\n\ntable.dataframe .rightBorder {\n    border-right-color: var(--inner-border-color);\n}\n\ntable.dataframe .rightAlign {\n    text-align: right;\n}\n\ntable.dataframe .expanderSvg {\n    width: 8px;\n    height: 8px;\n    margin-right: 3px;\n}\n\ntable.dataframe .expander {\n    display: flex;\n    align-items: center;\n}\n\n&sol;* formatting *&sol;\n\ntable.dataframe .null {\n    color: var(--text-color-pale);\n}\n\ntable.dataframe .structural {\n    color: var(--text-color-medium);\n    font-weight: bold;\n}\n\ntable.dataframe .dataFrameCaption {\n    font-weight: bold;\n}\n\ntable.dataframe .numbers {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe td:hover .formatted .structural, .null {\n    color: var(--text-color-dark);\n}\n\ntable.dataframe tr:hover .formatted .structural, .null {\n    color: var(--text-color-dark);\n}\n\n\n\n\n:root {\n    --scroll-bg: #f5f5f5;\n    --scroll-fg: #b3b3b3;\n}\n:root[theme=&quot;dark&quot;], :root [data-jp-theme-light=&quot;false&quot;]{\n    --scroll-bg: #3c3c3c;\n    --scroll-fg: #97e1fb;\n}\nbody {\n    scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n}\nbody::-webkit-scrollbar {\n    width: 10px; &sol;* Mostly for vertical scrollbars *&sol;\n    height: 10px; &sol;* Mostly for horizontal scrollbars *&sol;\n}\nbody::-webkit-scrollbar-thumb {\n    background-color: var(--scroll-fg);\n}\nbody::-webkit-scrollbar-track {\n    background-color: var(--scroll-bg);\n}\n            &lt;&sol;style&gt;\n        &lt;&sol;head&gt;\n        &lt;body&gt;\n            \n&lt;table class=&quot;dataframe&quot; id=&quot;df_1996488707&quot;&gt;&lt;&sol;table&gt;\n\n&lt;p class=&quot;dataframe_description&quot;&gt;... showing only top 5 of 150 rows&lt;&sol;p&gt;&lt;p class=&quot;dataframe_description&quot;&gt;DataFrame: rowsCount = 150, columnsCount = 5&lt;&sol;p&gt;\n\n        &lt;&sol;body&gt;\n        &lt;script&gt;\n            (function () {\n    window.DataFrame = window.DataFrame || new (function () {\n        this.addTable = function (df) {\n            let cols = df.cols;\n            for (let i = 0; i &lt; cols.length; i++) {\n                for (let c of cols[i].children) {\n                    cols[c].parent = i;\n                }\n            }\n            df.nrow = 0\n            for (let i = 0; i &lt; df.cols.length; i++) {\n                if (df.cols[i].values.length &gt; df.nrow) df.nrow = df.cols[i].values.length\n            }\n            if (df.id === df.rootId) {\n                df.expandedFrames = new Set()\n                df.childFrames = {}\n                const table = this.getTableElement(df.id)\n                table.df = df\n                for (let i = 0; i &lt; df.cols.length; i++) {\n                    let col = df.cols[i]\n                    if (col.parent === undefined &amp;&amp; col.children.length &gt; 0) col.expanded = true\n                }\n            } else {\n                const rootDf = this.getTableData(df.rootId)\n                rootDf.childFrames[df.id] = df\n            }\n        }\n\n        this.computeRenderData = function (df) {\n            let result = []\n            let pos = 0\n            for (let col = 0; col &lt; df.cols.length; col++) {\n                if (df.cols[col].parent === undefined)\n                    pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n            }\n            for (let i = 0; i &lt; result.length; i++) {\n                let row = result[i]\n                for (let j = 0; j &lt; row.length; j++) {\n                    let cell = row[j]\n                    if (j === 0)\n                        cell.leftBd = false\n                    if (j &lt; row.length - 1) {\n                        let nextData = row[j + 1]\n                        if (nextData.leftBd) cell.rightBd = true\n                        else if (cell.rightBd) nextData.leftBd = true\n                    } else cell.rightBd = false\n                }\n            }\n            return result\n        }\n\n        this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n            if (result.length === depth) {\n                const array = [];\n                if (pos &gt; 0) {\n                    let j = 0\n                    for (let i = 0; j &lt; pos; i++) {\n                        let c = result[depth - 1][i]\n                        j += c.span\n                        let copy = Object.assign({empty: true}, c)\n                        array.push(copy)\n                    }\n                }\n                result.push(array)\n            }\n            const col = cols[colId];\n            let size = 0;\n            if (col.expanded) {\n                let childPos = pos\n                for (let i = 0; i &lt; col.children.length; i++) {\n                    let child = col.children[i]\n                    let childLeft = i === 0 &amp;&amp; (col.children.length &gt; 1 || leftBorder)\n                    let childRight = i === col.children.length - 1 &amp;&amp; (col.children.length &gt; 1 || rightBorder)\n                    let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n                    childPos += childSize\n                    size += childSize\n                }\n            } else {\n                for (let i = depth + 1; i &lt; result.length; i++)\n                    result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n                size = 1\n            }\n            let left = leftBorder\n            let right = rightBorder\n            if (size &gt; 1) {\n                left = true\n                right = true\n            }\n            result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n            return size\n        }\n\n        this.getTableElement = function (id) {\n            return document.getElementById(&quot;df_&quot; + id)\n        }\n\n        this.getTableData = function (id) {\n            return this.getTableElement(id).df\n        }\n\n        this.createExpander = function (isExpanded) {\n            const svgNs = &quot;http:&sol;&sol;www.w3.org&sol;2000&sol;svg&quot;\n            let svg = document.createElementNS(svgNs, &quot;svg&quot;)\n            svg.classList.add(&quot;expanderSvg&quot;)\n            let path = document.createElementNS(svgNs, &quot;path&quot;)\n            if (isExpanded) {\n                svg.setAttribute(&quot;viewBox&quot;, &quot;0 -2 8 8&quot;)\n                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z&quot;)\n            } else {\n                svg.setAttribute(&quot;viewBox&quot;, &quot;-2 0 8 8&quot;)\n                path.setAttribute(&quot;d&quot;, &quot;M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z&quot;)\n            }\n            path.setAttribute(&quot;fill&quot;, &quot;currentColor&quot;)\n            svg.appendChild(path)\n            return svg\n        }\n\n        this.renderTable = function (id) {\n\n            let table = this.getTableElement(id)\n\n            if (table === null) return\n\n            table.innerHTML = &quot;&quot;\n\n            let df = table.df\n            let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n\n            &sol;&sol; header\n            let header = document.createElement(&quot;thead&quot;)\n            table.appendChild(header)\n\n            let renderData = this.computeRenderData(df)\n            for (let j = 0; j &lt; renderData.length; j++) {\n                let rowData = renderData[j]\n                let tr = document.createElement(&quot;tr&quot;);\n                let isLastRow = j === renderData.length - 1\n                header.appendChild(tr);\n                for (let i = 0; i &lt; rowData.length; i++) {\n                    let cell = rowData[i]\n                    let th = document.createElement(&quot;th&quot;);\n                    th.setAttribute(&quot;colspan&quot;, cell.span)\n                    let colId = cell.id\n                    let col = df.cols[colId];\n                    if (!cell.empty) {\n                        if (col.children.length === 0) {\n                            th.innerHTML = col.name\n                        } else {\n                            let link = document.createElement(&quot;a&quot;)\n                            link.className = &quot;expander&quot;\n                            let that = this\n                            link.onclick = function () {\n                                col.expanded = !col.expanded\n                                that.renderTable(id)\n                            }\n                            link.appendChild(this.createExpander(col.expanded))\n                            link.innerHTML += col.name\n                            th.appendChild(link)\n                        }\n                    }\n                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n                    if (col.rightAlign)\n                        classes += &quot; rightAlign&quot;\n                    if (isLastRow)\n                        classes += &quot; bottomBorder&quot;\n                    if (classes.length &gt; 0)\n                        th.setAttribute(&quot;class&quot;, classes)\n                    tr.appendChild(th)\n                }\n            }\n\n            &sol;&sol; body\n            let body = document.createElement(&quot;tbody&quot;)\n            table.appendChild(body)\n\n            let columns = renderData.pop()\n            for (let row = 0; row &lt; df.nrow; row++) {\n                let tr = document.createElement(&quot;tr&quot;);\n                body.appendChild(tr)\n                for (let i = 0; i &lt; columns.length; i++) {\n                    let cell = columns[i]\n                    let td = document.createElement(&quot;td&quot;);\n                    let colId = cell.id\n                    let col = df.cols[colId]\n                    let classes = (cell.leftBd ? &quot; leftBorder&quot; : &quot;&quot;) + (cell.rightBd ? &quot; rightBorder&quot; : &quot;&quot;)\n                    if (col.rightAlign)\n                        classes += &quot; rightAlign&quot;\n                    if (classes.length &gt; 0)\n                        td.setAttribute(&quot;class&quot;, classes)\n                    tr.appendChild(td)\n                    let value = col.values[row]\n                    if (value.frameId !== undefined) {\n                        let frameId = value.frameId\n                        let expanded = rootDf.expandedFrames.has(frameId)\n                        let link = document.createElement(&quot;a&quot;)\n                        link.className = &quot;expander&quot;\n                        let that = this\n                        link.onclick = function () {\n                            if (rootDf.expandedFrames.has(frameId))\n                                rootDf.expandedFrames.delete(frameId)\n                            else rootDf.expandedFrames.add(frameId)\n                            that.renderTable(id)\n                        }\n                        link.appendChild(this.createExpander(expanded))\n                        link.innerHTML += value.value\n                        if (expanded) {\n                            td.appendChild(link)\n                            td.appendChild(document.createElement(&quot;p&quot;))\n                            const childTable = document.createElement(&quot;table&quot;)\n                            childTable.className = &quot;dataframe&quot;\n                            childTable.id = &quot;df_&quot; + frameId\n                            let childDf = rootDf.childFrames[frameId]\n                            childTable.df = childDf\n                            td.appendChild(childTable)\n                            this.renderTable(frameId)\n                            if (childDf.nrow !== childDf.totalRows) {\n                                const footer = document.createElement(&quot;p&quot;)\n                                footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n                                td.appendChild(footer)\n                            }\n                        } else {\n                            td.appendChild(link)\n                        }\n                    } else if (value.style !== undefined) {\n                        td.innerHTML = value.value\n                        td.setAttribute(&quot;style&quot;, value.style)\n                    } else td.innerHTML = value\n                    this.nodeScriptReplace(td)\n                }\n            }\n        }\n\n        this.nodeScriptReplace = function (node) {\n            if (this.nodeScriptIs(node) === true) {\n                node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n            } else {\n                let i = -1, children = node.childNodes;\n                while (++i &lt; children.length) {\n                    this.nodeScriptReplace(children[i]);\n                }\n            }\n\n            return node;\n        }\n\n        this.nodeScriptClone = function (node) {\n            let script = document.createElement(&quot;script&quot;);\n            script.text = node.innerHTML;\n\n            let i = -1, attrs = node.attributes, attr;\n            while (++i &lt; attrs.length) {\n                script.setAttribute((attr = attrs[i]).name, attr.value);\n            }\n            return script;\n        }\n\n        this.nodeScriptIs = function (node) {\n            return node.tagName === 'SCRIPT';\n        }\n    })()\n\n    window.call_DataFrame = function (f) {\n        return f();\n    };\n\n    let funQueue = window[&quot;kotlinQueues&quot;] &amp;&amp; window[&quot;kotlinQueues&quot;][&quot;DataFrame&quot;];\n    if (funQueue) {\n        funQueue.forEach(function (f) {\n            f();\n        });\n        funQueue = [];\n    }\n})()\n\n&sol;*&lt;!--*&sol;\ncall_DataFrame(function() { DataFrame.addTable({ cols: [{ name: &quot;&lt;span title=&bsol;&quot;sepal_length: Double&bsol;&quot;&gt;sepal_length&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;5,1&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;4,9&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;4,7&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;4,6&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;5,0&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;sepal_width: Double&bsol;&quot;&gt;sepal_width&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;3,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;3,0&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;3,2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;3,1&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;3,6&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;petal_length: Double&bsol;&quot;&gt;petal_length&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,3&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,5&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;1,4&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;petal_width: Double&bsol;&quot;&gt;petal_width&lt;&sol;span&gt;&quot;, children: [], rightAlign: true, values: [&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;0,2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;0,2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;0,2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;0,2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;,&quot;&lt;span class=&bsol;&quot;formatted&bsol;&quot; title=&bsol;&quot;&bsol;&quot;&gt;&lt;span class=&bsol;&quot;numbers&bsol;&quot;&gt;0,2&lt;&sol;span&gt;&lt;&sol;span&gt;&quot;] }, \n{ name: &quot;&lt;span title=&bsol;&quot;species: String&bsol;&quot;&gt;species&lt;&sol;span&gt;&quot;, children: [], rightAlign: false, values: [&quot;setosa&quot;,&quot;setosa&quot;,&quot;setosa&quot;,&quot;setosa&quot;,&quot;setosa&quot;] }, \n], id: 1996488707, rootId: 1996488707, totalRows: 150 } ) });\n&sol;*--&gt;*&sol;\n\ncall_DataFrame(function() { DataFrame.renderTable(1996488707) });\n\n\n\n        &lt;&sol;script&gt;\n        &lt;&sol;html&gt;\"></iframe>\n            <script>\n                function o_resize_iframe_out_4() {\n                    let elem = document.getElementById(\"iframe_out_4\");\n                    resize_iframe_out_4(elem);\n                    setInterval(resize_iframe_out_4, 5000, elem);\n                }\n                function resize_iframe_out_4(el) {\n                    let h = el.contentWindow.document.body.scrollHeight;\n                    el.height = h === 0 ? 0 : h + 41;\n                }\n            </script>",
      "application/kotlindataframe+json": "{\"nrow\":150,\"ncol\":5,\"columns\":[\"sepal_length\",\"sepal_width\",\"petal_length\",\"petal_width\",\"species\"],\"kotlin_dataframe\":[{\"sepal_length\":5.1,\"sepal_width\":3.5,\"petal_length\":1.4,\"petal_width\":0.2,\"species\":\"setosa\"},{\"sepal_length\":4.9,\"sepal_width\":3.0,\"petal_length\":1.4,\"petal_width\":0.2,\"species\":\"setosa\"},{\"sepal_length\":4.7,\"sepal_width\":3.2,\"petal_length\":1.3,\"petal_width\":0.2,\"species\":\"setosa\"},{\"sepal_length\":4.6,\"sepal_width\":3.1,\"petal_length\":1.5,\"petal_width\":0.2,\"species\":\"setosa\"},{\"sepal_length\":5.0,\"sepal_width\":3.6,\"petal_length\":1.4,\"petal_width\":0.2,\"species\":\"setosa\"}]}"
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's now see what's happening there under the hood. First, we enable debugging logging that will print the code that is executed under the hood."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:20.826898500Z",
     "start_time": "2023-07-01T16:26:17.976898300Z"
    }
   },
   "outputs": [],
   "source": [
    "%trackExecution"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then, we define some other dataframe."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:22.598896Z",
     "start_time": "2023-07-01T16:26:18.109896400Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Executing:\n",
      "val df1 = dataFrameOf(\"A\", \"B\", \"C\")(1, \"Str1\", null, 2, \"Str2\", 3)\n",
      "\r\n",
      "Executing:\n",
      "@DataSchema\n",
      "interface _DataFrameType1\n",
      "\n",
      "val ColumnsContainer<_DataFrameType1>.A: DataColumn<Int> @JvmName(\"_DataFrameType1_A\") get() = this[\"A\"] as DataColumn<Int>\n",
      "val DataRow<_DataFrameType1>.A: Int @JvmName(\"_DataFrameType1_A\") get() = this[\"A\"] as Int\n",
      "val ColumnsContainer<_DataFrameType1?>.A: DataColumn<Int?> @JvmName(\"Nullable_DataFrameType1_A\") get() = this[\"A\"] as DataColumn<Int?>\n",
      "val DataRow<_DataFrameType1?>.A: Int? @JvmName(\"Nullable_DataFrameType1_A\") get() = this[\"A\"] as Int?\n",
      "val ColumnsContainer<_DataFrameType1>.B: DataColumn<String> @JvmName(\"_DataFrameType1_B\") get() = this[\"B\"] as DataColumn<String>\n",
      "val DataRow<_DataFrameType1>.B: String @JvmName(\"_DataFrameType1_B\") get() = this[\"B\"] as String\n",
      "val ColumnsContainer<_DataFrameType1?>.B: DataColumn<String?> @JvmName(\"Nullable_DataFrameType1_B\") get() = this[\"B\"] as DataColumn<String?>\n",
      "val DataRow<_DataFrameType1?>.B: String? @JvmName(\"Nullable_DataFrameType1_B\") get() = this[\"B\"] as String?\n",
      "val ColumnsContainer<_DataFrameType1>.C: DataColumn<Int?> @JvmName(\"_DataFrameType1_C\") get() = this[\"C\"] as DataColumn<Int?>\n",
      "val DataRow<_DataFrameType1>.C: Int? @JvmName(\"_DataFrameType1_C\") get() = this[\"C\"] as Int?\n",
      "val ColumnsContainer<_DataFrameType1?>.C: DataColumn<Int?> @JvmName(\"Nullable_DataFrameType1_C\") get() = this[\"C\"] as DataColumn<Int?>\n",
      "val DataRow<_DataFrameType1?>.C: Int? @JvmName(\"Nullable_DataFrameType1_C\") get() = this[\"C\"] as Int?\n",
      "df1.cast<_DataFrameType1>()\r\n",
      "Executing:\n",
      "val df1 = res54\r\n"
     ]
    }
   ],
   "source": [
    "val df1 = dataFrameOf(\"A\", \"B\", \"C\")(1, \"Str1\", null, 2, \"Str2\", 3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, a marker interface `_DataFrameType1` is created and property accessors are generated for it. Let's check what's the type of `df1` now:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:22.896913600Z",
     "start_time": "2023-07-01T16:26:19.412895300Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Executing:\n",
      "::df1\n",
      "\r\n"
     ]
    },
    {
     "data": {
      "text/plain": "val Line_55_jupyter.df1: org.jetbrains.kotlinx.dataframe.DataFrame<Line_54_jupyter._DataFrameType1>"
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "::df1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, `df1` now is not simply a `DataFrame<*>`, it's `DataFrame<_DataFrameType1>`. That's exactly what allows us to statically resolve defined property accessors on it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:22.899897600Z",
     "start_time": "2023-07-01T16:26:19.694009700Z"
    }
   },
   "outputs": [],
   "source": [
    "%trackExecution off"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "API that DataFrame uses to achieve all of these is open, and you can try it yourself! The code of the integration is available [here](https://github.com/Kotlin/dataframe/blob/master/dataframe-jupyter/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/Integration.kt)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Inter-cell API"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To use Kotlin Notebook API you don't necessarily need to create a separate file with integration. As it was shown above, you can place in `USE { }` call the same integration that you would\n",
    "place in the standalone library or JSON descriptor. However, notebook offers API to get some information about the current notebook session and to set it up.\n",
    "\n",
    "The main entry point is `notebook`: it allows you to investigate what cells were already executed, what libraries were loaded, what renderers and variable processors are loaded and gives the ability to unload them.\n",
    "Read the documentation of the `Notebook` interface for reliable and actual information about this API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:23.056895600Z",
     "start_time": "2023-07-01T16:26:19.711907100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "> 2 + 2\n\n> val result = 3 * 14\n\n> result\n\n> (Out[3] as Int) / 2\n\n> val a1: Int = 1\nval a2: Int? = 2\nval a3: Int? = null\n"
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "notebook.cellsList.take(5).map { \"> \" + it.code }.joinToString(\"\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:23.292899900Z",
     "start_time": "2023-07-01T16:26:20.125896500Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "0.11.0.381"
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "notebook.kernelVersion"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:23.338896200Z",
     "start_time": "2023-07-01T16:26:20.302896300Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "{0=[], 1=[result], 2=[result], 3=[result], 4=[a1, a3, result], -1=[___a2, a2, kandyConfig, dataFrameConfig, df, df1, height, width], 5=[result, a1, a2], 7=[result, a1, a2], 9=[result, a1, a2], 10=[kotlinMascot, result, a1, a2], 11=[result, a1, a2], 12=[result, a1, a2], 13=[graphics, height, image, width, result, a1, a2], 14=[result, a1, a2, height, width], 15=[a1, a2, height, width], 16=[a1, a2, height, width], 17=[a1, a2, height, width], 20=[a2, height, width], 21=[height, width], 22=[height, width], 23=[height, width], 24=[experimentData, experimentX, experimentY, gaussPlot, height, width], 25=[height, width], 27=[bob, height, width], 28=[height, width], 29=[height, width], 30=[height, width], 31=[height, width], 32=[height, width], 33=[height, width], 34=[height, width], 36=[height, width], 37=[height, width], 38=[height, width], 39=[height, width], 40=[height, width], 42=[height, width], 43=[height, width], 45=[height, width], 46=[height, width], 47=[height, width]}"
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "notebook.cellVariables"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Also, a couple of options is available with `SessionOptions` object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:23.354896700Z",
     "start_time": "2023-07-01T16:26:20.468007400Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "true"
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "SessionOptions.resolveSources // could be switched off to speed up dependencies loading process"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sharing the notebooks\n",
    "\n",
    "Essentially, Kotlin notebooks are Jupyter notebooks. It means they could be opened, edited and run with any Jupyter client such as [Jupyter Notebook](https://jupyter.org/),\n",
    "[Jupyter Lab](https://jupyterlab.readthedocs.io/en/latest/) and [Datalore](https://www.jetbrains.com/datalore/). [We plan](https://youtrack.jetbrains.com/issue/KTNB-291/Datalore-Share-action) to integrate with Datalore better in the future.\n",
    "The only limitation is that project dependencies will be not included into the notebook in other clients. However, you can build the logic based on Jupyter client type:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:23.386896200Z",
     "start_time": "2023-07-01T16:26:20.915897500Z"
    }
   },
   "outputs": [],
   "source": [
    "if (notebook.jupyterClientType != JupyterClientType.KOTLIN_NOTEBOOK) {\n",
    "    // load substitutive dependencies\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notebooks could be also loaded and viewed on GitHub (including gists). Limitation there is that JS isn't executed in the outputs.\n",
    "To overcome it in `kandy`, we [add extra SVG output that is hidden from JS](https://github.com/Kotlin/kandy/blob/main/kandy-lets-plot/src/main/kotlin/org/jetbrains/kotlinx/kandy/letsplot/util/rendering.kt#L46).\n",
    "\n",
    "Kotlin Notebooks could be also converted to some other format using [nbconvert tool](https://nbconvert.readthedocs.io/en/latest/)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## What's next?\n",
    "\n",
    "Kotlin Notebook project is experimental and actively developed. Use the latest version of plugin to be in sync.\n",
    "We eagerly need your stories and feedback: share them in the dedicated [#notebooks](https://kotlinlang.slack.com/archives/C05333T208Y) Slack channel or in our [issue tracker](https://youtrack.jetbrains.com/issues/KTNB).\n",
    "\n",
    "See you in the next cell!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-01T16:26:23.388895Z",
     "start_time": "2023-07-01T16:26:21.279905600Z"
    }
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Kotlin",
   "language": "kotlin",
   "name": "kotlin"
  },
  "language_info": {
   "codemirror_mode": "text/x-kotlin",
   "file_extension": ".kt",
   "mimetype": "text/x-kotlin",
   "name": "kotlin",
   "nbconvert_exporter": "",
   "pygments_lexer": "kotlin",
   "version": "1.8.20"
  },
  "ktnbPluginMetadata": {
   "projectLibraries": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
